spark не читает все файлы orc из другой папки, используя схему слияния - PullRequest
0 голосов
/ 14 ноября 2018

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

user1.orc в / data / user1 /

+-------------------+--------------------+
| userid            |     name           |
+-------------------+--------------------+
|         1         |            aa      |
|         6         |            vv      |
+-------------------+--------------------+

user2.orc в / data / user2 /

+-------------------+--------------------+
| userid            |     info           |
+-------------------+--------------------+
|         11        |            i1      |
|         66        |            i6      |
+-------------------+--------------------+

user3.orc в / data / user3 /

+-------------------+--------------------+
| userid            |     con            |
+-------------------+--------------------+
|         12        |            888     |
|         17        |            123     |
+-------------------+--------------------+

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

+-------------------+--------------------+--------------------+----------+
| userid            |         name       |       info         |    con   |
+-------------------+--------------------+--------------------+----------+
|             1     |         aa         |       null         |  null    |
|             6     |         vv         |       null         |  null    |
|            11     |        null        |         i1         |  null    |
|            66     |        null        |         i6         |  null    |
|            12     |        null        |       null         |  888     |
|            17     |        null        |       null         |  123     |

, поэтому я использовал вот так

val df =spark.read.option("mergeSchema","true").orc("file:///home/hadoop/data/")

, но он дает общий столбец для всех файлов

+-------------------+
| userid            |
+-------------------+
|             1     |
|             6     |
|            11     |
|            66     |
|            12     |
|            17     |

Так как читать все этитри файла в одном кадре?

1 Ответ

0 голосов
/ 14 ноября 2018

У меня есть очень глупый обходной путь, на случай, если вы не найдете решения.

Считайте все эти файлы в разные фреймы данных и затем выполните операцию объединения, что-то вроде ниже:

val user1 = sparkSession.read.orc("/home/prasadkhode/data/user1/").toJSON
val user2 = sparkSession.read.orc("/home/prasadkhode/data/user2/").toJSON
val user3 = sparkSession.read.orc("/home/prasadkhode/data/user3/").toJSON

val result = sparkSession.read.json(user1.union(user2).union(user3).rdd)

result.printSchema()
result.show(false)

и вывод будет:

root
 |-- con: long (nullable = true)
 |-- info: string (nullable = true)
 |-- name: string (nullable = true)
 |-- userId: long (nullable = true)

+----+----+----+------+
|con |info|name|userId|
+----+----+----+------+
|null|null|vv  |6     |
|null|null|aa  |1     |
|null|i6  |null|66    |
|null|i1  |null|11    |
|888 |null|null|12    |
|123 |null|null|17    |
+----+----+----+------+

Обновление:

Похоже, что нет поддержки mergeSchema для orc данных, естьоткрытый билет в Spark Jira

enter image description here

...