2017-01-19 15 views
1

Я пытаюсь преобразовать файлы CSV в паркет, и я использую Spark для этого.Паркетная схема и Spark

SparkSession spark = SparkSession 
    .builder() 
    .appName(appName) 
    .config("spark.master", master) 
    .getOrCreate(); 

Dataset<Row> logFile = spark.read().csv("log_file.csv"); 
logFile.write().parquet("log_file.parquet"); 

Теперь проблема я не имеют схемы определены и столбцы выглядеть следующим образом (выход отображается с помощью printSchema() в искру)

root 
|-- _c0: string (nullable = true) 
|-- _c1: string (nullable = true) 
|-- _c2: string (nullable = true) 
.... 

CSV-есть имена в первой строке но они игнорируются, я думаю, проблема только в нескольких столбцах - это строки, у меня также есть ints и даты.

Каковы мои возможности для определения схемы и как? Если мне нужно написать файл паркета по-другому, тогда не проблема, если это быстрое решение.

(я использую искровой автономно для испытаний/не знаю Scala)

+1

Вы пробовали '.option (« inferschema », true)' при чтении csv? –

+0

@rajat просто попробовал, это лучше, но не идеально, где-то увидел, что я могу использовать 'StructType' для этого. (также используется 'option (" header ", true)') У меня есть еще одна проблема, однако некоторые столбцы являются нулевыми, и они не должны быть ... позвольте мне проверить CSV, не уверен, как искра ожидает формат точно (кавычки или нет кавычек) – changepicture

+1

при чтении через spark-csv вы можете указать опцию («режим», «FAILFAST»). «Это даст ошибку, если какая-либо строка не имеет той же самой схемы, как указано. –

ответ

3

Попробуйте использовать .option ("inferschema", "правда") присутствует Spark-csv пакет. Это автоматически выведет схему из данных.

Вы также можете определить пользовательскую схему для своих данных с помощью типа struct и использовать .schema(schema_name) для чтения на основе пользовательской схемы.

val sqlContext = new SQLContext(sc) 
val customSchema = StructType(Array(
    StructField("year", IntegerType, true), 
    StructField("make", StringType, true), 
    StructField("model", StringType, true), 
    StructField("comment", StringType, true), 
    StructField("blank", StringType, true))) 

val df = sqlContext.read 
    .format("com.databricks.spark.csv") 
    .option("header", "true") // Use first line of all files as header 
    .schema(customSchema) 
    .load("cars.csv")