Pyspark DataFrames:在数组列中的某个值的过滤器



i在Pyspark中具有一个数据框,该框架具有其中一个字段的嵌套数组值。我想过滤数组包含特定字符串的数据框。我看不到我该怎么做。

模式看起来像这样: root |-- name: string (nullable = true) |-- lastName: array (nullable = true) | |-- element: string (containsNull = false)

我想返回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官方文件现在可以用SQL语言完成

对于您的问题,应该是

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

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

相关内容

  • 没有找到相关文章

最新更新