在非空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],...

我该如何编写一个过滤器函数,我只得到这些行,其中包含一个数字?

+0

可以通过定义用户在火花定义函数实现这一点。一个用于测试数组是否为空,另一个用于测试数组是否包含某些内容。 – dumitru

你可以用火花中的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

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

可以只使用size方法和与阵列尺寸过滤所有那些行= 0

df.filter(""" size(fahrspur_liste) != 0 """)