【问题标题】:spark does not read all orc files from different folder using merge schemaspark不使用合并模式从不同文件夹读取所有orc文件
【发布时间】:2019-04-17 04:55:15
【问题描述】:

我在三个不同的文件夹中有三个不同的 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     |

那么如何一口气读完这三个文件呢?

【问题讨论】:

    标签: apache-spark apache-spark-sql orc


    【解决方案1】:

    我有一个非常愚蠢的解决方法给你,以防万一你找不到任何解决方案。

    将所有这些文件读入不同的数据帧,然后执行联合操作,如下所示:

    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 数据似乎不支持mergeSchemaSpark Jira 中有一个未公开的票证

    【讨论】:

    • 其实我的数据量很大,每天的数据差不多5GB,所以如果我单独读取每个文件,然后再合并它们会变慢吗?
    • 是的,这会对性能产生影响,这取决于集群的大小、使用的配置参数以及分配给作业的资源等...
    猜你喜欢
    • 2018-01-31
    • 2015-08-27
    • 2020-10-15
    • 1970-01-01
    • 2017-08-07
    • 2019-02-11
    • 2019-05-14
    • 2021-01-08
    • 2015-12-04
    相关资源
    最近更新 更多