【问题标题】:pyspark fillna is not working on column of ArrayTypepyspark fillna 不适用于 ArrayType 列
【发布时间】:2021-10-07 16:11:43
【问题描述】:

我有一个火花集群版本 3.1.2。我有以下输入数据

+-------+------+------------+
|   name|gender|         arr|
+-------+------+------------+
|  James|     M|     [60000]|
|Michael|     M| [70000, 31]|
| Robert|  null|[44, 400000]|
|  Maria|     F|[500000, 12]|
|    Jen|      |        null|
+-------+------+------------+

我必须从所有列中删除空值。 “gender”列是 StringType,而“arr”列是 ArrayType。一些值为 null 是两列。当我应用 fillna 函数时,值会从性别列中删除,但不会从 arr 列中删除。看看输出

>>> df.fillna("").show()
+-------+------+------------+
|   name|gender|         arr|
+-------+------+------------+
|  James|     M|     [60000]|
|Michael|     M| [70000, 31]|
| Robert|      |[44, 400000]|
|  Maria|     F|[500000, 12]|
|    Jen|      |        null|
+-------+------+------------+

如果我使用 na.drop 或 na.fill 函数,也会发生同样的情况。问题出在哪里 ?如何从 arr 列中删除 null

【问题讨论】:

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


    【解决方案1】:

    fillna 仅支持int, float, string, bool 数据类型,其他数据类型的列将被忽略。

    例如,如果 value 是一个字符串,并且 subset 包含一个非字符串列,那么该非字符串列将被简单地忽略。(doc)

    您可以使用when and otherwise 构造替换数组列中的null 值。

    import pyspark.sql.functions as F
    default_value = F.array().cast("array<int>")
    fill_rule = F.when(F.col('arr').isNull(),default_value).otherwise(F.col('arr'))
    df.withColumn('arr', fill_rule).show()
    

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 1970-01-01
      • 2021-07-03
      • 2019-09-03
      • 2021-03-09
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多