PySpark DataFrames:某些值位于数组列中的筛选器

PySpark DataFrames:某些值位于数组列中的筛选器,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我在PySpark中有一个数据帧,其中一个字段有一个嵌套的数组值。我想过滤数组中包含特定字符串的数据帧。我不知道我怎么能做到 架构如下所示: 根 |--名称:字符串(nullable=true) |--lastName:array(nullable=true) ||--元素:字符串(containsnall=false) 我想返回upper(name)='JOHN'和lastName列(数组)包含'SMITH'的所有行,其中的等式应该不区分大小写(就像我对名称所做的那样)。我在列值上找到了i

我在PySpark中有一个数据帧,其中一个字段有一个嵌套的数组值。我想过滤数组中包含特定字符串的数据帧。我不知道我怎么能做到

架构如下所示:

根
|--名称:字符串(nullable=true)
|--lastName:array(nullable=true)
||--元素:字符串(containsnall=false)


我想返回
upper(name)='JOHN'
lastName
列(数组)包含
'SMITH'
的所有行,其中的等式应该不区分大小写(就像我对名称所做的那样)。我在列值上找到了
isin()
函数,但这似乎与我想要的相反。似乎我需要一个列值上的
contains()
函数。任何人都有直接的方法来做这件事吗?

< P>你可以直接考虑基础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()

<>你可以考虑直接处理底层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\u包含
转换
现在可以用sql语言完成

对于你的问题,它应该是

dataframe.filter('array_contains(transform(lastName, x -> upper(x)), "JOHN")')
它比以前使用
RDD
作为桥梁的解决方案要好,因为
DataFrame
操作比
RDD
操作快得多。

2019年的更新

spark 2.4.0引入了新功能,如
array\u包含
转换
现在可以用sql语言完成

对于你的问题,它应该是

dataframe.filter('array_contains(transform(lastName, x -> upper(x)), "JOHN")')
它比以前使用
RDD
作为桥梁的解决方案要好,因为
DataFrame
操作比
RDD
操作快得多