При чтении CSV есть возможность начать со строки 2 или ниже? - PullRequest
1 голос
/ 28 октября 2019

Я читаю кучу файлов CSV в кадре данных, используя приведенный ниже пример кода.

val df = spark.read.format("csv")
   .option("sep","|")
   .option("inferSchema","true")
   .option("header","false")
   .load("mnt/rawdata/corp/ABC*.gz")

Я надеюсь, что есть способ начать со строки 2 или ниже, потому что строка 1 содержит некоторые основные метаданные об этих файлах, а первая строка имеет 4 символа канала, поэтому Spark считает, что файлимеет 4 столбца, но фактически содержит более 100 столбцов в реальных данных.

Я попытался поиграть с inferSchema и заголовком, но не смог заставить что-либо работать.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Вы правы! Вам необходимо определить собственную схему! Я закончил с этим.

import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType};
import org.apache.spark.sql.functions.input_file_name

val customSchema = StructType(Array(
    StructField("field1", StringType, true),
    StructField("field2", StringType, true),
    StructField("field3", StringType, true),
    StructField("field4", StringType, true),
    StructField("field5", StringType, true),
    StructField("field6", StringType, true),
    StructField("field7", StringType, true)))

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "false")
    .option("sep", "|")
    .schema(customSchema)
    .load("mnt/rawdata/corp/ABC*.gz")
    .withColumn("file_name", input_file_name())
1 голос
/ 28 октября 2019

Если первая строка в CSV не соответствует фактическому количеству столбцов и именам, вам может потребоваться определить схему вручную, а затем попробовать следующую комбинацию:

val df = spark.read.format("csv")
   .option("sep","|")
   .option("inferSchema","false")
   .option("header","true")     
   .schema(mySchema)
   .option("enforceSchema","true")
   .load(...

Полный список параметров CSV.

Обратите внимание, что для Spark 2.3 и выше вы можете использовать сокращенную запись в стиле SQL для определения схемы - простую строку "column1 type1, column2 type2, ...".

Если, однако, ваш заголовок содержит более одной строки, вы, вероятно, будете вынуждены игнорировать все "ошибки", используя дополнительную опцию .option("mode","DROPMALFORMED").

...