Как объединить наборы данных CSV с различными заголовками (имена и количество)? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть один или несколько CSV-файлов, которые мне нужно объединить в pyspark:

файл 1:

c1,c2,c3
1,3,4

файл 2:

c4,c5,c6
4,5,6

файл 3

c1,c2
7,8

Мне нужно объединить файлы, чтобы получить результат:

c1,c2,c3,c4,c5,c6
1,2,3,null,null,null
null,null,null,4,5,6
7,8,null,null,null,null

Я попытался:

  1. загрузка всехфайлы из папки, используя метод загрузки:

    spark.read.format("csv").option("header","true")

  2. объединение файлов с помощью слияния.

оба использовалисьтолько одна из файлов схемы

c1,c2,c3
1,3,4
4,5,6
7,8

1 Ответ

0 голосов
/ 12 декабря 2018

Прочитать все файлы - f1, f2, f3 и объединить имена столбцов.Затем для каждого файла найдите столбцы дополнения и сгенерируйте новые столбцы с подсветкой (ноль).Наконец, объедините все DFS, выбрав имена столбцов по порядку.Вот решение scala.

val f1 = spark.read.format("csv").option("inferSchema","true").option("header","true").load("in/f1.csv")
val f2 = spark.read.format("csv").option("inferSchema","true").option("header","true").load("in/f2.csv")
val f3 = spark.read.format("csv").option("inferSchema","true").option("header","true").load("in/f3.csv")

val fall = f1.columns.union(f2.columns).union(f3.columns).distinct

val f1c = fall.diff(f1.columns)
val f1a = f1c.foldLeft(f1)( (acc,r) => acc.withColumn(r,lit(null)) )

val f2c = fall.diff(f2.columns)
val f2a = f2c.foldLeft(f2)( (acc,r) => acc.withColumn(r,lit(null)) )

val f3c = fall.diff(f3.columns)
val f3a = f3c.foldLeft(f3)( (acc,r) => acc.withColumn(r,lit(null)) )

val result = f1a.select(fall.head,fall.tail:_*).union(f2a.select(fall.head,fall.tail:_*)).union(f3a.select(fall.head,fall.tail:_*))
result.printSchema
result.show(false)

Результаты:

root
 |-- c1: integer (nullable = true)
 |-- c2: integer (nullable = true)
 |-- c3: integer (nullable = true)
 |-- c4: integer (nullable = true)
 |-- c5: integer (nullable = true)
 |-- c6: integer (nullable = true)

+----+----+----+----+----+----+
|c1  |c2  |c3  |c4  |c5  |c6  |
+----+----+----+----+----+----+
|1   |3   |4   |null|null|null|
|null|null|null|4   |5   |6   |
|7   |8   |null|null|null|null|
+----+----+----+----+----+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...