Что такое эквивалентный разделитель ^ G при чтении CSV с искрой? - PullRequest
0 голосов
/ 12 января 2019

Итак, мне действительно нужна помощь с глупостью, но, видимо, я не могу справиться с этим сам.

У меня есть набор строк в файле этого формата (чтение с less в OSX):

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.

есть unkown character (вы ничего не видите только потому, что я отформатировал его здесь в stackoverflow).

UPDATE: может ли это быть ограничением искры для скалы? Если я запускаю код с помощью scala следующим образом:

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

display(df)

Я получаю большой жир

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 Ответ

0 голосов
/ 12 января 2019

Это выглядит ограничением с этими версиями в spark-scala, Вот поддерживаемый разделитель для csv в коде,

апаш / искровой / SQL / катализатор / CSV / CSVOptions.scala

val delimiter = CSVExprUtils.toChar(
    parameters.getOrElse("sep", parameters.getOrElse("delimiter", ",")))

--- CSVExprUtils.toChar

апаш / искровой / SQL / катализатор / CSV / CSVExprUtils.scala

  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")
}
...