Добавление имен файлов из массива в столбце dataframe в spark scala - PullRequest
0 голосов
/ 18 февраля 2020
val hadoopConf = new Configuration()

val fs = FileSystem.get(hadoopConf)

val status = fs.listStatus(new Path("/home/Test/")).map(_.getPath().toString)

val df =  spark.read.format("json").load(status : _*)

Как добавить имя файла в новый столбец в df?

Я пытался:

val dfWithCol = df.withColumn("filename",input_file_name())

Но он добавляет одинаковое имя файла во всех столбцах? Кто-нибудь может предложить лучший подход?

1 Ответ

1 голос
/ 18 февраля 2020

Это ожидаемое поведение, потому что ваш json файл содержит more than one record.

Spark добавляет filenames для каждой записи, и вы хотите проверить все уникальные имена файлов, затем выполните distinct на столбец имени файла

//to get unique filenames
df.select("filename").distinct().show()

Example:

#source data
hadoop fs -cat /user/shu/json/*.json
{"id":1,"name":"a"}
{"id":1,"name":"a"}

val hadoopConf = new Configuration()

val fs = FileSystem.get(hadoopConf)

val status = fs.listStatus(new Path("/user/shu/json")).map(_.getPath().toString)

val df =  spark.read.format("json").load(status : _*)

df.withColumn("filename",input_file_name()).show(false)

//unique filenames for each record
+---+----+----------------------------------------------------------------------------+
|id |name|input                                                                       |
+---+----+----------------------------------------------------------------------------+
|1  |a   |hdfs://nn:8020/user/shu/json/i.json                                         |
|1  |a   |hdfs://nn:8020/user/shu/json/i1.json                                        |
+---+----+----------------------------------------------------------------------------+

В приведенном выше примере вы можете увидеть unique filenames для каждой записи (as i have 1 record in each json file).

...