在非空包中的过滤数据框



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

我的程序代码看起来像这样:

...    
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。

您可以只使用size方法并过滤所有这些行尺寸= 0

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

您可以使用Spark中的udf进行此操作:

val removeEmpty = udf((array: Seq[Long]) => !array.isEmpty)
val df2 = df.filter(removeEmpty($"fahrspur_liste"))

此处udf检查数组是否为空。然后,过滤器功能将删除那些返回的函数。

相关内容

  • 没有找到相关文章