【问题标题】:Remove empty strings from list in DataFrame column从 DataFrame 列中的列表中删除空字符串
【发布时间】:2020-10-15 01:00:46
【问题描述】:

我有一个 DataFrame 列,其中包含一个包含一些空值的列表:

df.select('foo').show(10)
+----------+
|foo       |
+----------+
|[,]       |
|[bar, baz]|
|[,bar]    |
+----------+

我想过滤掉所有空值,即它应该是这样的:

+----------+
|foo       |
+----------+
|null      |
|[bar, baz]|
|[bar]     |
+----------+

我尝试使用array_remove,但无法排除空字符串。

【问题讨论】:

  • 你可以使用UDF的

标签: apache-spark pyspark apache-spark-sql pyspark-dataframes


【解决方案1】:

你可以用过滤器方法做到这一点

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2015-10-25
      • 2014-02-18
      • 2020-12-14
      相关资源
      最近更新 更多