Получите подпапку как столбец при чтении нескольких паркетных файлов с помощью SparkSQL - PullRequest
1 голос
/ 09 июля 2020

Я хотел бы добавить столбец в каждый DataFrame, загруженный из паркетных файлов с помощью Spark SQL, чтобы добавить подстроку пути к файлу, а затем сделать его одним DataFrame.

Например , при загрузке .../subfolder1/my_parquet_file1.parquet и .../subfolder2/my_parquet_file2.parquet я хочу иметь следующий окончательный DataFrame:

col1 | col2 | subfolder
------------------------
aaa  | bbb  | subfolder1
ccc  | ddd  | subfolder1
eee  | fff  | subfolder2
ggg  | hhh  | subfolder2

Следующий код позволяет загружать все файлы в списке путей:

sqlContext.read.schema(schema).parquet(paths: _*)

Но, имея непосредственно последний DataFrame, я не могу добавить подпапку в зависимости от того, откуда взялась каждая строка.

Есть ли способ сделать это без последовательной загрузки каждого файла?

1 Ответ

2 голосов
/ 09 июля 2020

попробуйте это -

val df = spark.read
      .parquet(
        getClass.getResource("/parquet/day/day1/part-00000-4ece3595-e410-4301-aefd-431cd1debf91-c000.snappy.parquet")
          .getPath,
        getClass.getResource("/parquet/day/day2/part-00000-4ece3595-e410-4301-aefd-431cd1debf91-c000.snappy.parquet")
          .getPath
      )
    df.show(false)
    df.printSchema()

    /**
      * +------+
      * |price |
      * +------+
      * |123.15|
      * |123.15|
      * +------+
      *
      * root
      * |-- price: decimal(5,2) (nullable = true)
      */

    df.withColumn("subfolder", element_at(split(input_file_name(), "/"), -2))
      .show(false)

    /**
      * +------+---------+
      * |price |subfolder|
      * +------+---------+
      * |123.15|day1     |
      * |123.15|day2     |
      * +------+---------+
      */
...