Как разобрать csv, который использует ^ A (т.е. \ 001) в качестве разделителя с помощью spark-csv?

Ужасно новичок в Spark, Hive, Big Data, Scala и всем остальном. Я пытаюсь написать простую функцию, которая принимает sqlContext, загружает файл csv из s3 и возвращает DataFrame. Проблема в том, что этот конкретный csv использует символ ^ A (т.е. \ 001) в качестве разделителя, а набор данных огромен, поэтому я не могу просто написать на нем "s / \ 001 /, / g". Кроме того, поля могут содержать запятые или другие символы, которые я мог бы использовать в качестве разделителя.

Я знаю, что в пакете spark-csv, который я использую, есть параметр разделителя, но я не знаю, как установить его, чтобы он читал \ 001 как один символ, а не что-то вроде экранированных 0, 0 и 1. Может, мне стоит использовать hiveContext или что-то в этом роде?


person Community    schedule 15.03.2016    source источник


Ответы (2)


Если вы проверите страницу GitHub, там есть параметр delimiter для spark-csv (как вы также отметили). Используйте это так:

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .option("inferSchema", "true") // Automatically infer data types
    .option("delimiter", "\u0001")
    .load("cars.csv")
person Daniel Zolnai    schedule 15.03.2016
comment
Спасибо! Я не знал об этом \ u0. Не могли бы вы подробнее объяснить, что это означает и что делает? Я предполагаю, что «u» для юникода, но я хочу понять это правильно. - person ; 15.03.2016
comment
\ Char отмечает начало escape-последовательности, что означает, что следующий символ не является частью строки, но имеет особое значение. Символ u означает, что следующие числа являются кодом Unicode для символа, а 0001 - кодом Unicode для этого специального символа. Что он делает, он просто вставляет этот специальный символ в строку. - person Daniel Zolnai; 15.03.2016
comment
используйте '\ x01' в качестве разделителя, если вы используете pyspark - person ghosts; 11.08.2017
comment
Сработало ли вышеуказанное решение .option (delimiter, \ u0001). Это дает мне ошибку, как указано ниже java.lang.IllegalArgumentException: Неподдерживаемый специальный символ для разделителя: \ u0001 в org.apache.spark.sql.execution.datasources.csv.CSVUtils $ .toChar (CSVUtils.scala: 106) в org .apache.spark.sql.execution.datasources.csv.CSVOptions. ‹init› (CSVOptions.scala: 83) в org.apache.spark.sql.execution.datasources.csv.CSVOptions. ‹init› (CSVOptions.scala: 39) - person vinu.m.19; 24.04.2019
comment
Если вы используете Spark 2.x, то вы используете встроенный синтаксический анализатор csv, который на данный момент не поддерживает установку какого-либо символа в качестве разделителя. - person Daniel Zolnai; 25.04.2019
comment
Этот ответ сработал для меня: stackoverflow.com/a/46349762/1316649 - person fstang; 26.06.2019

В Spark 2.x и CSV API используйте параметр sep:

val df = spark.read
  .option("sep", "\u0001")
  .csv("path_to_csv_files")
person Mark Rajcok    schedule 07.05.2019