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 转换为空数组?的主要内容,如果未能解决你的问题,请参考以下文章
在 Scala 中使用来自另一个没有数组列的 DataFrame 的数组类型列创建 Spark DataFrame 的有效方法是啥?
Spark/Scala:对带有数组类型列的 DataFrame 中的某些组件的操作