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

Dan*_*abe 1 python pyspark pyspark-sql

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

root
 |-- authors: array (nullable = true)
 |    |-- element: string (containsNull = true)
Run Code Online (Sandbox Code Playgroud)

我想过滤这个DataFrame,选择所有具有与特定作者相关的条目的行.因此,如果该作者是第一个作者authors或第n个作者,如果他们的名字出现,则应该包括该行.所以有些东西

df.filter(df['authors'].getItem(i)=='Some Author')
Run Code Online (Sandbox Code Playgroud)

其中,i通过该行,这是不跨行常数所有作者迭代.

我尝试实现给PySpark DataFrames的解决方案:过滤一些值在数组列中,但它给了我

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

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

Psi*_*dom 6

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

df.filter(array_contains(df['authors'], 'Some Author'))
Run Code Online (Sandbox Code Playgroud)
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]|
+--------------------+
Run Code Online (Sandbox Code Playgroud)