在 spark sql 中用无值替换 Null 值

Posted

技术标签:

【中文标题】在 spark sql 中用无值替换 Null 值【英文标题】:Replace Null values with no value in spark sql 【发布时间】:2020-03-12 20:36:58 【问题描述】:

我正在从具有空值的数据帧将 csv 文件写入数据湖。 Spark sql 明确地将值设置为 Null 用于空值。我想用没有值或没有其他字符串替换这些空值。

当我从 databricks 写入 csv 文件时,它看起来像这样

ColA,ColB,ColC 
null,ABC,123     
ffgg,DEF,345    
null,XYZ,789

我尝试使用fill.na 将空值替换为'',但是当我这样做时,文件会这样写

ColA,ColB,ColC    
'',ABC,123     
ffgg,DEF,345    
'',XYZ,789

我希望我的 csv 文件看起来像这样。我如何从 spark sql 中实现这一点。我正在使用数据块。非常感谢这方面的任何帮助。

ColA,ColB,ColC    
,ABC,123     
ffg,DEF,345    
,XYZ,789

谢谢!

【问题讨论】:

这能回答你的问题吗? Writing CSV file using Spark and scala - empty quotes instead of Null values option("nullValue", null) 如果您的 first field 为空,则将无法工作仍保留为 "" 【参考方案1】:

我认为我们需要在这种情况下使用 .saveAsTextFile 而不是 csv

Example:

df.show()
//+----+----+----+
//|col1|col2|col3|
//+----+----+----+
//|null| ABC| 123|
//|  dd| ABC| 123|
//+----+----+----+

//extract header from dataframe
val header=spark.sparkContext.parallelize(Seq(df.columns.mkString(",")))

//union header with data and replace [|]|null then save
header.union(df.rdd.map(x => x.toString)).map(x => x.replaceAll("[\\[|\\]|null]","")).coalesce(1).saveAsTextFile("<path>")

//content of file
//co1,co2,co3
//,ABC,123
//dd,ABC,123

如果您的数据中的 First fieldnot null,那么您可以使用 csv 选项:

 df.write.option("nullValue", null).mode("overwrite").csv("<path>")

【讨论】:

非常感谢。这帮助很大

以上是关于在 spark sql 中用无值替换 Null 值的主要内容,如果未能解决你的问题,请参考以下文章

Scala Spark用NULL替换空String

informix 在选择中用 0 替换空值

sql server中表达式null=0的值是

在 R 中,通过在嵌套列表中用 NA 替换 NULL 来防止 unlist 删除 NULL 值

MySql查询在Select中用空字符串替换NULL

不再迷惑,无值和NULL值