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_contains
和transform
官方文件现在可以用SQL语言完成
对于您的问题,应该是
dataframe.filter('array_contains(transform(lastName, x -> upper(x)), "JOHN")')
它比以前使用RDD
作为桥的解决方案要好,因为DataFrame
操作比RDD
的操作要快得多。