【问题标题】:How to create a predefined schema for Spark?如何为 Spark 创建预定义架构?
【发布时间】: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


    【解决方案1】:

    如果你不能用spark来做,我认为创建一个将json转换为模式的类并不复杂,然后每天存储你的json文件。

    【讨论】:

    • 是的,但是我在哪里以及如何存储它以便 Spark 将其称为架构?
    • 可以将文件schema.json存放在date=2017-03-23目录下,然后读取为json并转换json schema:example json {"name": "id", "type ": "string"} 变成 schema= StructType(Seq(StructFiel("id", StringType, true)))
    • 这是一个选项,虽然我希望在检查文件时找到 Spark 自己执行此操作的隐式方式
    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多