在非空WrappedArray上过滤数据帧
问题描述:
我的问题是我必须在列表中找到这些不是空的。当我使用过滤器功能不是空的,比我得到的每一行。在非空WrappedArray上过滤数据帧
我的程序代码如下所示:
...
val csc = new CassandraSQLContext(sc)
val df = csc.sql("SELECT * FROM test").toDF()
val wrapped = df.select("fahrspur_liste")
wrapped.printSchema
列fahrspur_liste
包含包裹阵列和本专栏我来分析。当我运行的代码,比我得到这个结构,我的包裹阵列和这些条目:
root
|-- fahrspur_liste: array (nullable = true)
| |-- element: long (containsNull = true)
+--------------+
|fahrspur_liste|
+--------------+
| []|
| []|
| [56]|
| []|
| [36]|
| []|
| []|
| [34]|
| []|
| []|
| []|
| []|
| []|
| []|
| []|
| [103]|
| []|
| [136]|
| []|
| [77]|
+--------------+
only showing top 20 rows
现在我要过滤这些行,让我只有条目[56],[36],[ 34],[103],...
我该如何编写一个过滤器函数,我只得到这些行,其中包含一个数字?
答
你可以用火花中的udf
来做到这一点。简单例子:
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
val df = spark.sparkContext.parallelize(Seq(Seq(123L), Seq(456L), Seq(), Seq()))
.toDF("fahrspur_liste")
df.show()
+--------------+
| [123]|
| [456]|
| []|
| []|
+--------------+
val removeEmpty = udf((array: Seq[Long]) => !array.isEmpty)
val df2 = df.filter(removeEmpty($"fahrspur_liste"))
df2.show()
+--------------+
|fahrspur_liste|
+--------------+
| [123]|
| [456]|
+--------------+
这里udf
检查该数组为空或没有。过滤器函数将删除那些返回为真的。
+1
谢谢。这解决了我的问题! – DaShI
可以通过定义用户在火花定义函数实现这一点。一个用于测试数组是否为空,另一个用于测试数组是否包含某些内容。 – dumitru