#apache-spark #pyspark #apache-spark-sql #pyspark-dataframes
#apache-spark #pyspark #apache-spark-sql
Вопрос:
У меня есть DataFrame
столбец, содержащий список с некоторыми пустыми значениями:
df.select('foo').show(10)
----------
|foo |
----------
|[,] |
|[bar, baz]|
|[,bar] |
----------
Я хотел бы отфильтровать все пустые значения, т. Е. Это должно выглядеть так:
----------
|foo |
----------
|null |
|[bar, baz]|
|[bar] |
----------
Я пытался использовать array_remove
, но я не могу исключить пустую строку.
Комментарии:
1. Разрешено ли вам использовать UDF
Ответ №1:
Вы можете сделать это с помощью метода filter
df.withColumn("newColumn", expr("filter(foo, elem -> elem != '')")).show
Если вы не хотите сохранять исходный столбец, вы можете просто использовать то же имя:
df.withColumn("foo", expr("filter(foo, elem -> elem != '')")).show
Результат (сохранение обоих столбцов)
---------- ----------
| foo| foonew|
---------- ----------
| [, ]| []|
|[bar, baz]|[bar, baz]|
| [, bar]| [bar]|
---------- ----------
Ответ №2:
Пожалуйста, используйте этот, с ожидаемым результатом, используя только функцию фильтра
from pyspark.sql.functions import expr, when, size, lit
from pyspark.sql.session import SparkSession
spark = SparkSession.builder.getOrCreate()
spark.createDataFrame([[[None, None]],
[['bar', 'bar']],
[[None, 'bar']]],
schema=['foo'])
.withColumn('foo', when(size(expr("filter(foo, elem -> elem != '')")) == 0, lit(None))
.otherwise(expr("filter(foo, elem -> elem != '')")))
.show(truncate=False)
----------
|foo |
----------
|null |
|[bar, bar]|
|[bar] |
----------