Spark SQL在拆分后无法识别空值

Posted

技术标签:

【中文标题】Spark SQL在拆分后无法识别空值【英文标题】:Spark SQL not recognizing null values after split 【发布时间】:2018-10-16 10:36:32 【问题描述】:

我有与此处提出的问题类似的数据和问题: Spark sql how to explode without losing null values

我已经使用了为 Spark

df.withColumn("likes", explode(
  when(col("likes").isNotNull, col("likes"))
    // If null explode an array<string> with a single null
    .otherwise(array(lit(null).cast("string")))))

问题是,在那之后我需要检查该列中是否有空值并在这种情况下采取措施。 Wehn 我尝试运行我的代码,作为文字插入的空值被识别为字符串而不是空值。

因此,即使该行在该列中有空值,下面的代码也将始终返回 0:

df.withColumn("likes", f.when(col('likes').isNotNull(), 0).otherwise(2)).show()

+--------+------+
|likes   |origin|
+--------+------+
|    CARS|     0|
|    CARS|     0|
|    null|     0|
|    null|     0|

我使用 cloudera pyspark

【问题讨论】:

【参考方案1】:

你可以破解这个,使用udf

val empty = udf(() => null: String)

df.withColumn("likes", explode(
  when(col("likes").isNotNull, col("likes"))
    // If null explode an array<string> with a single null
    .otherwise(array(empty()))))

【讨论】:

嗨,谢谢。我只是复制粘贴你的函数,我得到一个错误:文件“”,第 1 行:undefined val empty = udf(() => null: String) ^ SyntaxError: invalid syntax。也许它不适用于所有版本?我正在使用 pyspark 嗨,我不知道为什么 udf 对我不起作用,但我找到了另一种方法并在这里回答。无论如何,我会将您的答案标记为好,以便它可以帮助其他人。谢谢【参考方案2】:

我实际上找到了一种方法。否则得写这个:

.otherwise(array(lit(None).cast("string")))))

【讨论】:

以上是关于Spark SQL在拆分后无法识别空值的主要内容,如果未能解决你的问题,请参考以下文章

SQL Management Studio 在脚本创建后无法识别表存在

从 SQL 导入后 Excel 无法识别数字单元格

Spark / Databricks 代码无法识别日期字段错误

Pyspark 命令无法识别

为啥 spark 无法识别我的“数据框布尔表达式”?

Spark 无法识别提供给 withWatermark() 的事件时间列