Отфильтруйте 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 реализовать этот фильтр?
Ответ #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
Ответ #2
Ответ на вопрос: Отфильтруйте PySpark DataFrame, проверив, отображается ли строка в столбце
Просто дополняю хороший ответ @Psidom.
Я 9X_python знаю, что ваш столбец author
является массивом, но 9X_pythonista для другого типа столбца (например, строки) вы 9X_pythonista можете сделать это:
df.filter(df.authors.contains('Some Author')).show()
-
2
-
1
-
3
-
18
-
2
-
1
-
3
-
1
-
5
-
6
-
1
-
2
-
1
-
2
-
4
-
1
-
2
-
2
-
1
-
3
-
1
-
2
-
4
-
2
-
2
-
2
-
1
-
1
-
1
-
1
-
3
-
2
-
1
-
1
-
2
-
2
-
1
-
6
-
1
-
1
-
4
-
9
-
7
-
2
-
5
-
1
-
2
-
1
-
1
-
1