通过检查字符串是否出现在列中,过滤pyspark dataframe



我是新手的火花和过滤。我有一个pyspark.sql dataframe通过在JSON文件中读取而创建的。该模式的一部分如下所示:

root
 |-- authors: array (nullable = true)
 |    |-- element: string (containsNull = true)

我想过滤此数据框架,选择所有与特定作者有关的条目的行。因此,无论该作者是authors还是nth中列出的第一作者,如果出现其名称,则应包括该行。所以

的线
df.filter(df['authors'].getItem(i)=='Some Author')

i通过该行中的所有作者迭代,这不是跨行恒定的。

我尝试实现给出pyspark dataFrames的解决方案:在数组列中某个值的过滤器,但它给了我

valueerror:某些类型不能由前100行确定, 请重试采样

是否有一种简洁的方法来实现此过滤器?

您可以使用pyspark.sql.functions.array_contains方法:

df.filter(array_contains(df['authors'], 'Some Author'))

from pyspark.sql.types import *
from pyspark.sql.functions import array_contains
lst = [(["author 1", "author 2"],), (["author 2"],) , (["author 1"],)]
schema = StructType([StructField("authors", ArrayType(StringType()), True)])
df = spark.createDataFrame(lst, schema)
df.show()
+--------------------+
|             authors|
+--------------------+
|[author 1, author 2]|
|          [author 2]|
|          [author 1]|
+--------------------+
df.printSchema()
root
 |-- authors: array (nullable = true)
 |    |-- element: string (containsNull = true)
df.filter(array_contains(df.authors, "author 1")).show()
+--------------------+
|             authors|
+--------------------+
|[author 1, author 2]|
|          [author 1]|
+--------------------+

只是补充了@psidom的好答案。
我知道您的列author是一个数组,但是对于另一种类型的列(如字符串),您可以这样做:

df.filter(df.authors.contains('Some Author')).show()

最新更新