使用Spark读取CSV时,^G的分隔符是什么?

4
所以,我真的需要帮助解决一件愚蠢的事情,但显然我自己无法处理它。
我有一组以此格式排列的行(在OSX上使用less读取):
XXXXXXXX^GT^XXXXXXXX^G\N^G0^GDL^G\N^G2018-09-14 13:57:00.0^G2018-09-16 00:00:00.0^GCompleted^G\N^G\N^G1^G2018-09-16 21:41:02.267^G1^G2018-09-16 21:41:02.267^GXXXXXXX^G\N
YYYYYYYY^GS^XXXXXXXX^G\N^G0^GDL^G\N^G2018-08-29 00:00:00.0^G2018-08-29 23:00:00.0^GCompleted^G\N^G\N^G1^G2018-09-16 21:41:03.797^G1^G2018-09-16 21:41:03.81^GXXXXXXX^G\N

所以分隔符是 BEL 分隔符,我是这样加载CSV的:
val df = sqlContext.read.format("csv")
  .option("header", "false")
  .option("inferSchema", "true")
  .option("delimiter", "\u2407")
  .option("nullValue", "\\N")
  .load("part0000")

但是当我阅读它时,它只将行作为一列读取,就像这样:

XXXXXXXXCXXXXXXXX\N0DL\N2018-09-15 00:00:00.02018-09-16 00:00:00.0Completed\N\N12018-09-16 21:41:03.25712018-09-16 21:41:03.263XXXXXXXX\N
XXXXXXXXSXXXXXXXX\N0DL\N2018-09-15 00:00:00.02018-09-15 23:00:00.0Completed\N\N12018-09-16 21:41:03.3712018-09-16 21:41:03.373XXXXXXXX\N

似乎在^G的位置上有一个未知字符(你在stackoverflow上看不到,因为我在此处进行了格式化)。

更新: 这可能是scala的spark限制吗? 如果我以以下方式运行代码:

val df = sqlContext.read.format("csv")
  .option("header", "false")
  .option("inferSchema", "true")
  .option("delimiter", "\\a")
  .option("nullValue", "\\N")
  .load("part-m-00000")

display(df)

I get a big fat

java.lang.IllegalArgumentException: Unsupported special character for delimiter: \a

如果我使用Python运行:

df = sqlContext.read.format('csv').options(header='false', inferSchema='true', delimiter = "\a", nullValue = '\\N').load('part-m-00000')

display(df)

一切都很好!

1个回答

2
这在spark-scala的这些版本中看起来有限制。以下是代码中支持的csv分隔符,保留html标签:apache/spark/sql/catalyst/csv/CSVOptions.scala
val delimiter = CSVExprUtils.toChar(
    parameters.getOrElse("sep", parameters.getOrElse("delimiter", ",")))

--- CSVExprUtils.toChar

apache/spark/sql/catalyst/csv/CSVExprUtils.scala

这段内容是关于it技术中的CSVExprUtils.toChar函数的介绍,具体实现可以参考链接中的代码。
  def toChar(str: String): Char = {
(str: Seq[Char]) match {
  case Seq() => throw new IllegalArgumentException("Delimiter cannot be empty string")
  case Seq('\\') => throw new IllegalArgumentException("Single backslash is prohibited." +
    " It has special meaning as beginning of an escape sequence." +
    " To get the backslash character, pass a string with two backslashes as the delimiter.")
  case Seq(c) => c
  case Seq('\\', 't') => '\t'
  case Seq('\\', 'r') => '\r'
  case Seq('\\', 'b') => '\b'
  case Seq('\\', 'f') => '\f'
  // In case user changes quote char and uses \" as delimiter in options
  case Seq('\\', '\"') => '\"'
  case Seq('\\', '\'') => '\''
  case Seq('\\', '\\') => '\\'
  case _ if str == """\u0000""" => '\u0000'
  case Seq('\\', _) =>
    throw new IllegalArgumentException(s"Unsupported special character for delimiter: $str")
  case _ =>
    throw new IllegalArgumentException(s"Delimiter cannot be more than one character: $str")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接