【问题标题】:Spark-Scala Malformed Line IssueSpark-Scala 格式错误的行问题
【发布时间】:2017-06-05 23:52:51
【问题描述】:

我有一个 control-A 分隔文件,我正在尝试将其转换为 parquet 格式。但是在文件中有一个字符串字段,其中包含一个 "。

读取如下数据:

val dataframe = sparkSession.sqlContext.read
                .format("com.databricks.spark.csv")
                .option("delimiter", datasetDelimiter)
                .option("header", "false")
                .option("mode","FAILFAST")
                //.option("mode", "DROPMALFORMED")
                .option("treatEmptyValuesAsNulls","true")
                .option("nullValue"," ")
                .option("ignoreLeadingWhiteSpace", "true")
                .option("ignoreTrailingWhiteSpace", "true")
                .schema(schema)
                .load(fileLocation)
                dataframe

如您所见,数据中只有一个开放的双引号,没有封闭的双引号。这导致格式错误的线路异常。在阅读时,我明确提到分隔符为 U0001。有什么方法可以将此类数据转换为镶木地板而不会丢失任何数据

【问题讨论】:

  • 我假设这是 Spark1 的?
  • 为什么要使用 CSV 格式?为什么不直接使用text 并相应地拆分行?

标签: scala apache-spark malformed


【解决方案1】:

您可以将quote 选项设置为空字符串

.option("quote", "") 
// or, equivalently, .option("quote", '\u0000')

这将告诉 Spark 将 " 视为任何其他非特殊字符。

(使用 Spark 2.1.0 测试)

【讨论】:

  • 我们正在处理几个文件,无法知道哪个字符不会出现在数据中。
  • 知道了 - 原来有更好的选择 - 查看更新的答案
  • @Mg2729 另外,请考虑将“escape”选项设置为没有问题的选项,否则您可能会遇到更多意外行为。
  • @TzachZohar Thnaks 为您提供建议,我进行了更改,但仍然无法正常工作
  • 失败是同样的错误还是不同的错误?您使用的是哪个 Spark 版本?问,因为它确实对我有用你的示例数据。
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 2012-12-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2015-10-22
相关资源
最近更新 更多