Отфильтруйте PySpark DataFrame, проверив, отображается ли строка в столбце

Я новичок в Spark и экспериментирую с фильтрацией. У 9X_pyspark-sql меня есть DataFrame pyspark.sql, созданный 9X_pythonista путем чтения в файле json. Часть схемы показана 9X_pyspark-dataframes ниже:

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

Я хотел бы отфильтровать этот DataFrame, выбрав 9X_py все строки с записями, относящимися к определенному 9X_python-interpreter автору. Таким образом, независимо от того, является 9X_pyspark-dataframes ли этот автор первым автором, указанным 9X_pyspark-sql в authors или n-м, строка должна быть включена, если 9X_pythonic появляется их имя. Так что что-то вроде

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

где 9X_pyspark i выполняет итерацию по всем авторам в этой 9X_py строке, что не является постоянным для строк.

Я 9X_pythonic попытался реализовать решение, данное PySpark DataFrames: filter where some value is in array column, но 9X_py оно дает мне

ValueError: Некоторые типы не могут быть 9X_py определены по первым 100 строкам, пожалуйста, попробуйте 9X_pythonic еще раз с выборкой

Есть ли краткий способ 9X_pythonista реализовать этот фильтр?

6
0
2
Общее количество ответов: 2

Ответ #1

Ответ на вопрос: Отфильтруйте PySpark DataFrame, проверив, отображается ли строка в столбце

Вы можете использовать метод 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]|
+--------------------+

9X_pythonista

11
0

Ответ #2

Ответ на вопрос: Отфильтруйте PySpark DataFrame, проверив, отображается ли строка в столбце

Просто дополняю хороший ответ @Psidom.
Я 9X_python знаю, что ваш столбец author является массивом, но 9X_pythonista для другого типа столбца (например, строки) вы 9X_pythonista можете сделать это:

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

3
0