DataFrame 列(数组类型)包含 Null 值和空数组(len =0)。如何将 Null 转换为空数组?

Posted

技术标签:

【中文标题】DataFrame 列(数组类型)包含 Null 值和空数组(len =0)。如何将 Null 转换为空数组?【英文标题】:DataFrame column (Array type) contains Null values and empty array (len =0). How to convert Null to empty array? 【发布时间】:2020-08-13 13:28:15 【问题描述】:

我有一个带有 Array 列 (StringType) 的 Spark DataFrame

示例数据帧:

df = spark.createDataFrame([
  [None],   
  [[]],   
  [['foo']] 
]).toDF("a")

电流输出:

+-----+
|    a|
+-----+
| null|
|   []|
|[foo]|
+-----+

所需的输出:

+-----+
|    a|
+-----+
|   []|
|   []|
|[foo]|
+-----+

我需要将 Null 值转换为空数组以与另一个数组列连接。

已经试过了,但是不行

df.withColumn("a",F.coalesce(F.col("a"),F.from_json(F.lit("[]"), T.ArrayType(T.StringType()))))

Convert null values to empty array in Spark DataFrame

【问题讨论】:

好问题! 【参考方案1】:

使用array 函数。

df = spark.createDataFrame([
  [None],   
  [[]],   
  [['foo']] 
]).toDF("a")

import pyspark.sql.functions as F

df.withColumn('a', F.coalesce(F.col('a'), F.array(F.lit(None)))).show(10, False)
+-----+
|a    |
+-----+
|[]   |
|[]   |
|[foo]|
+-----+

结果现在是数组(字符串),所以没有空值。请检查结果。

temp = spark.sql("SELECT a FROM table WHERE a is NULL")
temp.show(10, False)
temp = spark.sql("SELECT a FROM table WHERE a = array(NULL)")
temp.show(10, False)
temp = spark.sql("SELECT a FROM table")
temp.show(10, False)


+---+
|a  |
+---+
+---+

+---+
|a  |
+---+
|[] |
+---+

+-----+
|a    |
+-----+
|[]   |
|[]   |
|[foo]|
+-----+

【讨论】:

我仍然有 Null 值。专栏是ArrayType(StringType) 这有意义吗? 什么版本的 spark, python? Spark 3 和 Python 3.6 甚至我的代码也适用于 spark 3.0.0 和 python 3.8.5。我认为火花版本是问题,所以它应该工作。我已经添加了我的完整代码。 结果显示不正确(Presto/Superset)。导出并验证 CSV 后,一切似乎都是正确的。非常感谢您的耐心和帮助!!

以上是关于DataFrame 列(数组类型)包含 Null 值和空数组(len =0)。如何将 Null 转换为空数组?的主要内容,如果未能解决你的问题,请参考以下文章

检查 arraytype 列是不是包含 null

在 Scala 中使用来自另一个没有数组列的 DataFrame 的数组类型列创建 Spark DataFrame 的有效方法是啥?

Spark DataFrame - 区分缺少列的记录与坏值

Spark/Scala:对带有数组类型列的 DataFrame 中的某些组件的操作

如何使用逗号分隔值拆分列并存储在 PySpark Dataframe 中的数组中?如下所示

使用包含多种类型的 numpy 数组创建 Pandas DataFrame