【问题标题】:Quotes not displayed in CSV output fileCSV 输出文件中未显示引号
【发布时间】:2020-02-04 15:16:14
【问题描述】:

初始数据在 Dataset 中,我正在尝试将每个单元格值写入 csv 文件以放在引号中。

result.coalesce(1).write()
            .option("delimiter", "|")
            .option("header", "true")
            .option("nullValue", "")
            .option("quoteMode", "ALL_NON_NULL")
            .csv(Location);

预期输出:

null
"London"|"UK"
"Delhi"|"India"
"Moscow"|"Russia"

电流输出:

null
London|UK
Delhi|India
Moscow|Russia

Spark 版本是 2.3

【问题讨论】:

    标签: csv apache-spark apache-spark-2.3


    【解决方案1】:

    正如@Oli 回答的那样,您拥有的第一个选项是 CSV 写入器中的"quoteMode"

    如果您需要更多控制,那么您可以在所有列上使用 concat 函数来为您的值添加前缀和后缀。下面的例子

    import org.apache.spark.sql.functions.{concat, lit, col}
    
    val df = Seq(
    ("1","a",null,"c"),
    ("3",null,"d","c"),
    ("4","a","b",null)
    ).toDF("id","A","B","C")
    
    df.show()
    
    +---+----+----+----+
    | id|   A|   B|   C|
    +---+----+----+----+
    |  1|   a|null|   c|
    |  3|null|   d|   c|
    |  4|   a|   b|null|
    +---+----+----+----+
    
    val dfquotes = df.select(df.columns.map(c => concat(lit("\""), col(c), lit("\"")).alias(c)): _*)
    
    dfquotes.show()
    
    +---+----+----+----+
    | id|   A|   B|   C|
    +---+----+----+----+
    |"1"| "a"|null| "c"|
    |"3"|null| "d"| "c"|
    |"4"| "a"| "b"|null|
    +---+----+----+----+
    

    【讨论】:

      【解决方案2】:

      "quoteMode" 是 databrick 的 CSV 写入器的一个选项。在这里,您使用的是 spark 的内置 CSV 编写器,它不支持该选项。查看this page 了解可用选项。

      在您的情况下,您正在寻找的选项是.option("quoteAll", true)

      【讨论】:

      • 如果我只想要非空值的引号怎么办?有什么选项可以代替quoteAll?
      • 我不确定标准 csv 编写器是否可行。只是出于好奇,为什么到处都需要引号?
      • 这是 Spark 1.6 中已经存在的代码。它正在生成报价。现在在尝试升级到 2.3 时,它没有给出报价。我们的业务用户不希望对输出进行任何类型的更改。我是 spark 的新手,也是这个项目的新手
      • 好吧,我没有任何简单的解决方案给你。您可以找到一种方法继续使用 spark 1.6(例如使用 yarn)或编写自己的 CSV 编写器(这并不复杂)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2018-12-20
      • 1970-01-01
      相关资源
      最近更新 更多