在Pyspark中筛选具有空数组的列

lsmd5eda  于 2022-11-30  发布在  Apache
关注(0)|答案(3)|浏览(156)

我有一个DataFrame,其中包含许多重复的值。它的聚合非重复计数如下所示

> df.groupby('fruits').count().sort(F.desc('count')).show()

| fruits        | count       |
| -----------   | ----------- |
| [Apples]      | 123         |
| []            | 344         |
| [Apples, plum]| 444         |

我的目标是筛选值为[Apples][]的所有行。
令人惊讶的是,下面的代码对非空数组有效,但对空数组无效

import pyspark.sql.types as T

is_apples = F.udf(lambda arr: arr == ['Apples'], T.BooleanType())
df.filter(is_apples(df.fruits).count() # WORKS! shows 123 correctly.

is_empty = F.udf(lambda arr: arr == [], T.BooleanType())
df.filter(is_empty(df.fruits).count() # Doesn't work! Should show 344 but shows zero.

知道我做错了什么吗?

2ledvvac

2ledvvac1#

它可能是包含空字符串的数组:

is_empty = F.udf(lambda arr: arr == [''], T.BooleanType())

或者它可能是一个null数组:

is_empty = F.udf(lambda arr: arr == [None], T.BooleanType())

若要一次检查所有项目,您可以用途:

is_empty = F.udf(lambda arr: arr in [[], [''], [None]], T.BooleanType())

但实际上,您不需要为此使用UDF,例如,您可以执行以下操作:

df.filter("fruits = array() or fruits = array('') or fruits = array(null)")
xeufq47z

xeufq47z2#

您可以通过检查数组的长度来完成此操作。

is_empty = F.udf(lambda arr: len(arr) == 0, T.BooleanType())
df.filter(is_empty(df.fruits).count()
lmvvr0a8

lmvvr0a83#

如果不想使用UDF,可以使用F.size来获取数组的大小。
要过滤空数组:

df.filter(F.size(df.fruits) == 0)

要筛选非空数组:

df.filter(F.size(df.fruits) != 0)

相关问题