spark 不使用合并模式从不同文件夹读取所有 orc 文件
spark does not read all orc files from different folder using merge schema
我在三个不同的文件夹中有三个不同的 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 |
那么如何一次读取所有这三个文件?
我有一个非常愚蠢的解决方法,以防万一你找不到任何解决方案。
将所有这些文件读入不同的数据帧,然后执行联合操作,如下所示:
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 |
+----+----+----+------+
更新:
orc
数据似乎不支持 mergeSchema
,Spark Jira
中有一个开放工单
我在三个不同的文件夹中有三个不同的 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 |
那么如何一次读取所有这三个文件?
我有一个非常愚蠢的解决方法,以防万一你找不到任何解决方案。
将所有这些文件读入不同的数据帧,然后执行联合操作,如下所示:
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 |
+----+----+----+------+
更新:
orc
数据似乎不支持 mergeSchema
,Spark Jira