Удаление пустых строк из списка в столбце DataFrame

#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]     |
 ----------