【问题标题】:Filtering a column with an empty array in Pyspark在 Pyspark 中过滤具有空数组的列
【发布时间】:2021-01-11 16:38:12
【问题描述】:

我有一个包含大量重复值的 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.

知道我做错了什么吗?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

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

    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())
    

    但实际上您不需要 UDF,例如你可以这样做:

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

    【讨论】:

      【解决方案2】:

      你可以通过检查数组的长度来做到这一点。

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

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        相关资源
        最近更新 更多