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_contains
和 transform
等新功能
official document
现在可以用 sql 语言
完成
对于你的问题,应该是
dataframe.filter('array_contains(transform(lastName, x -> upper(x)), "JOHN")')
它比以前使用 RDD
作为桥梁的解决方案更好,因为 DataFrame
操作比 RDD
快得多。
我在 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_contains
和 transform
等新功能
official document
现在可以用 sql 语言
对于你的问题,应该是
dataframe.filter('array_contains(transform(lastName, x -> upper(x)), "JOHN")')
它比以前使用 RDD
作为桥梁的解决方案更好,因为 DataFrame
操作比 RDD
快得多。