PySpark DataFrames:过滤某些值在数组列中的位置

PySpark DataFrames: filter where some value is in array column

我在 PySpark 中有一个 DataFrame,其中一个字段有一个嵌套数组值。我想过滤数组包含特定字符串的 DataFrame 。我不知道该怎么做。

架构如下所示: root |-- name: string (nullable = true) |-- lastName: array (nullable = true) | |-- element: string (containsNull = false)

我想 return upper(name) == 'JOHN'lastName 列(数组)包含 'SMITH' 的所有行并且那里的相等性应该不区分大小写(就像我为名字所做的那样)。我在列值上找到了 isin() 函数,但这似乎与我想要的相反。看来我需要一个 contains() 列值函数。任何人有任何想法可以直接做到这一点吗?

您可以考虑直接在底层 RDD 上工作。

def my_filter(row):
    if row.name.upper() == 'JOHN':
        for it in row.lastName:
            if it.upper() == 'SMITH':
                yield row

dataframe = dataframe.rdd.flatMap(my_filter).toDF()

2019 年更新

spark 2.4.0 引入了 array_containstransform 等新功能 official document 现在可以用 sql 语言

完成

对于你的问题,应该是

dataframe.filter('array_contains(transform(lastName, x -> upper(x)), "JOHN")')

它比以前使用 RDD 作为桥梁的解决方案更好,因为 DataFrame 操作比 RDD 快得多。