过滤非空WrappedArray上的数据帧

DaS*_*ShI 5 arrays scala apache-spark spark-dataframe

我的问题是我必须在列表中找到这些不是空的.当我使用过滤器函数不是null时,我也得到每一行.

我的程序代码如下所示:

...    
val csc = new CassandraSQLContext(sc)
val df = csc.sql("SELECT * FROM test").toDF()

val wrapped = df.select("fahrspur_liste")
wrapped.printSchema
Run Code Online (Sandbox Code Playgroud)

该列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
Run Code Online (Sandbox Code Playgroud)

现在我想过滤这些行,这样我只有条目[56],[36],[34],[103],...

我怎么能写一个过滤函数,我只得到这些包含数字的行?

phi*_*ert 14

我认为你不需要在这里使用UDF.

您可以使用size方法并过滤所有数组大小= 0的行

df.filter(""" size(fahrspur_liste) != 0 """)
Run Code Online (Sandbox Code Playgroud)


Sha*_*ica 3

您可以使用udfSpark 来执行此操作:

val removeEmpty = udf((array: Seq[Long]) => !array.isEmpty)

val df2 = df.filter(removeEmpty($"fahrspur_liste"))
Run Code Online (Sandbox Code Playgroud)

这里udf检查数组是否为空。然后过滤函数将删除那些返回为 true 的内容。