spark df.write 引用所有字段,但不引用空值

Posted

技术标签:

【中文标题】spark df.write 引用所有字段,但不引用空值【英文标题】:spark df.write quote all fields but not null values 【发布时间】:2017-08-24 19:22:17 【问题描述】:

我正在尝试从存储在表中的值创建一个 csv:

 | col1   | col2   | col3  |
 | "one"  | null   | "one" |
 | "two"  | "two"  | "two" |

hive > select * from table where col2 is null;
 one   null    one 

我正在使用以下代码获取 csv:

df.repartition(1)
  .write.option("header",true)
  .option("delimiter", ",")
  .option("quoteAll", true)
  .option("nullValue", "")
  .csv(S3Destination)

我得到的CSV:

"col1","col2","col3"
"one","","one"
"two","two","two"

预期的 Csv:NULL 值没有双引号

"col1","col2","col3"
"one",,"one"
"two","two","two"

如果数据框编写器有选项可以执行此操作,我们将不胜感激。

【问题讨论】:

【参考方案1】:

您可以采用 udf 方法并在可能存在双引号空字符串的列上应用(在上面重新分区的 datafrmae 上使用 withColumn),请参见下面的示例代码

 sqlContext.udf().register("convertToEmptyWithOutQuotes",(String abc) -> (abc.trim().length() > 0 ? abc : abc.replace("\"", " ")),DataTypes.StringType);

String 具有完成这项工作的 replace 方法。

val a =  Array("'x'","","z")
println(a.mkString(",").replace("\"", " "))

将产生'x',,z

【讨论】:

感谢您的帮助。我很感激。我正在寻找一种方法,数据框编写器可以选择不向空值添加双引号,因为我不想操作 csv。 抱歉 AFAIK 我不知道内置的此类选项。上述方法应该有效 如果您还好,请接受为所有者。它也将指向其他用户。谢谢!

以上是关于spark df.write 引用所有字段,但不引用空值的主要内容,如果未能解决你的问题,请参考以下文章

apache spark sql表覆盖问题

Spark落地到hive表中的两种方式及其区别

spark中覆盖的行为

Spark 中动态分区的 LeaseExpiredException

使用 Spark 截断 Oracle 表

Spark 不显示 Hive 表中的数据