我有一个服务(Secor),它将收到的原始邮件写入镶木地板文件。我想为这些镶木地板文件创建一个预定义的模式,因此Spark可以将多个文件与模式中可能的更改结合起来。
我们正在使用Spark 2.1.0
详细说明的例子: 我们在带有日期的文件夹下保存一整天的数据,并且在每个日期之下我们将数据按小时分隔。意思是,我们的镶木地板文件看起来像这样:
date=2017-03-23
|-- hour=00
|-- hour=01
//
|-- hour=23
让我们说解析为镶木地板的消息在一天开始时只包含两个字段的模式,比如说:
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会知道要查找的列,并添加缺少列的null
。在Spark 1.6中有_metadata
个文件,但似乎在Spark 2.1中它们不再存在。
如何为Spark手动创建这些模式文件?
答案 0 :(得分:0)
如果你不能用spark做到这一点,我认为创建一个将json转换为模式的类并不是很复杂,然后每天存储你的json文件。