Python 在Pyspark中筛选具有空数组的列
我有一个数据帧,它包含很多重复的值。它的聚合、不同计数如下所示Python 在Pyspark中筛选具有空数组的列,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我有一个数据帧,它包含很多重复的值。它的聚合、不同计数如下所示 > df.groupby('fruits').count().sort(F.desc('count')).show() | fruits | count | | ----------- | ----------- | | [Apples] | 123 | | [] | 344 | | [Apples, plum]| 444
> df.groupby('fruits').count().sort(F.desc('count')).show()
| fruits | count |
| ----------- | ----------- |
| [Apples] | 123 |
| [] | 344 |
| [Apples, plum]| 444 |
我的目标是筛选值为[Apples]
或[]
的所有行
令人惊讶的是,以下内容适用于非空数组,但对于空数组则不适用
将pyspark.sql.types导入为T
is_apples=F.udf(lambda-arr:arr==['apples'],T.BooleanType())
filter(is_apples(df.fruits).count()#有效!正确显示123。
is_empty=F.udf(lambda-arr:arr==[],T.BooleanType())
filter(为空(df.fruits).count()#不工作!应显示344,但显示零。
知道我做错了什么吗?可能是一个包含空字符串的数组:
is_empty = F.udf(lambda arr: arr == [''], T.BooleanType())
或者它可能是一个空数组:
is_empty = F.udf(lambda arr: arr == [None], T.BooleanType())
要一次检查所有数据,您可以使用:
is_empty = F.udf(lambda arr: arr in [[], [''], [None]], T.BooleanType())
但实际上,您不需要自定义项,例如,您可以:
df.filter("fruits = array() or fruits = array('') or fruits = array(null)")
您可以通过检查数组的长度来执行此操作
is_empty = F.udf(lambda arr: len(arr) == 0, T.BooleanType())
df.filter(is_empty(df.fruits).count()