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

时间:2016-06-24 18:28:38

标签: pyspark pyspark-sql

我在PySpark中有一个DataFrame,它的一个字段有一个嵌套数组值。我想过滤数组中包含某个字符串的DataFrame。我没有看到我能做到这一点。

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

我想返回upper(name) == 'JOHN'lastName列(数组)包含'SMITH'所在的所有行,并且相等应该不区分大小写(就像我为名称)。我在列值上找到了isin()函数,但这似乎与我想要的相反。看起来我需要在列值上使用contains()函数。任何人都有任何想法直截了当地做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以考虑直接处理基础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()

答案 1 :(得分:1)

2019年的更新

spark 2.4.0引入了新功能,例如array_containstransform official document 现在可以用sql语言完成

对于您的问题,应该是

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

这比以前使用RDD作为桥接的解决方案要好,因为DataFrame的操作要比RDD的操作快得多。