【发布时间】:2017-03-23 20:59:09
【问题描述】:
我有一个服务(Secor),它将收到的原始消息写入镶木地板文件。我想为这些 parquet 文件创建一个预定义的架构,以便 Spark 能够将多个文件与架构中可能发生的更改相结合。
我们使用的是 Spark 2.1.0
详细示例: 我们将一整天的数据保存在带有日期的文件夹下,并且在每个日期下,我们都有按小时分隔的数据。也就是说,我们的 parquet 文件如下所示:
date=2017-03-23
|-- hour=00
|-- hour=01
//
|-- hour=23
假设消息解析为 parquet 的架构在一天开始时仅包含两个字段,例如:
root
|-- user: String
|-- id: Long
现在中午左右,我们添加了另一个字段,因此架构变为:
root
|-- user: String
|-- id: Long
|-- country: String
这意味着如果我们尝试使用sparksession.read.parquet.("s3a://bucket/date=2017-03-23") 读取一整天的数据,Spark 将由于子文件夹没有相同的架构而崩溃。由于我们很少更改架构,因此我不喜欢使用架构合并选项,因为它非常昂贵。
底线:我想做的是预先定义一个模式并将其存储在date=2017-03-23下,这样Spark就会知道要查找哪些列,并添加@987654326 @ 缺少列的位置。在 Spark 1.6 中有 _metadata 文件,但在 Spark 2.1 中它们似乎不再存在。
如何为 Spark 手动创建这些架构文件?
【问题讨论】:
标签: apache-spark schema