Как читать файлы CSV с определением заголовка в отдельном файле? - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь прочитать большие CSV-файлы, в которых есть отдельный файл, содержащий заголовки для столбцов, пример ниже

Пример CSV part_000.csv (с разделителями канала):

000c7c09-66d7-47d6-9415-87e5010fe282|2019-04-08|EMAIL|active|43
030c2309-44d7-4676-7815-83e5010f3256|2019-03-18|EMAIL|lapsed|32

Пример файла заголовка _HEADER :

cid|character varying(36)
startdate|date
channel|character varying(20)
status|character varying(6)
age|integer

Как я могу прочитать файлы CSV и использовать файл заголовка для назначения схемы?

1 Ответ

2 голосов
/ 20 сентября 2019

Вы можете создать схему на основе файла HEADER, а затем прочитать ваши данные, используя схему:

 def defineType(str: String): DataType = {
    str match {
      case "date" => DateType
      case "integer" => IntegerType
      case x if x.startsWith("character") => StringType
      //  ... other types and logic
    }
  }

  def createSchema(pathToSchema: String): StructType = {
    val schemaDF = spark.read.option("sep", "|").csv(pathToSchema)
    val fields: Array[StructField] = schemaDF.collect().map(row => StructField(row.getString(0), defineType(row.getString(1))))
    StructType(fields)
  }

  val schema = createSchema("./data/csv_data/HEADER.csv")

  val df = spark.read.option("sep", "|").schema(schema).csv("./data/csv_data/part_000.csv")

  df.show(false)
  df.printSchema()

Вывод:

+------------------------------------+----------+-------+------+---+
|cid                                 |startdate |channel|status|age|
+------------------------------------+----------+-------+------+---+
|000c7c09-66d7-47d6-9415-87e5010fe282|2019-04-08|EMAIL  |active|43 |
|030c2309-44d7-4676-7815-83e5010f3256|2019-03-18|EMAIL  |lapsed|32 |
+------------------------------------+----------+-------+------+---+

root
 |-- cid: string (nullable = true)
 |-- startdate: date (nullable = true)
 |-- channel: string (nullable = true)
 |-- status: string (nullable = true)
 |-- age: integer (nullable = true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...