我在三个不同的文件夹中有三个不同的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 |
那么如何一次性读取所有这三个文件?
答案 0 :(得分:0)
为您提供一个非常愚蠢的解决方法,以防万一您找不到任何解决方案。
将所有这些文件读入不同的数据帧,然后执行合并操作,如下所示:
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中有一张开放票证