我在PySpark中有一个DataFrame,它的一个字段有一个嵌套数组值。我想过滤数组中包含某个字符串的DataFrame。我没有看到我能做到这一点。
架构如下所示:
root
|-- name: string (nullable = true)
|-- lastName: array (nullable = true)
| |-- element: string (containsNull = false)
我想返回upper(name) == 'JOHN'
和lastName
列(数组)包含'SMITH'
所在的所有行,并且相等应该不区分大小写(就像我为名称)。我在列值上找到了isin()
函数,但这似乎与我想要的相反。看起来我需要在列值上使用contains()
函数。任何人都有任何想法直截了当地做到这一点?
答案 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_contains
和transform
official document
现在可以用sql语言完成
对于您的问题,应该是
dataframe.filter('array_contains(transform(lastName, x -> upper(x)), "JOHN")')
这比以前使用RDD
作为桥接的解决方案要好,因为DataFrame
的操作要比RDD
的操作快得多。