通过检查字符串是否出现在列中来过滤PySpark DataFrame

时间:2017-09-19 22:29:12

标签: python pyspark pyspark-sql

我是Spark的新手并且正在玩过滤。我有一个通过读取json文件创建的pyspark.sql DataFrame。架构的一部分如下所示:

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

我想过滤此DataFrame,选择包含与特定作者相关的条目的所有行。因此,无论此作者是authors中列出的第一作者还是第n位作者,如果出现其名称,则应包括该行。

之类的东西
df.filter(df['authors'].getItem(i)=='Some Author')

其中i遍历该行中的所有作者,这在行之间不是一成不变的。

我尝试实施给PySpark DataFrames: filter where some value is in array column的解决方案,但它给了我

  

ValueError:有些类型无法由前100行确定,   请再次尝试采样

有没有简洁的方法来实现这个过滤器?

2 个答案:

答案 0 :(得分:6)

您可以使用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]|
+--------------------+

答案 1 :(得分:1)

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

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