【问题标题】:Spark partition projection/pushdown and schema inference with partitioned JSON使用分区 JSON 进行 Spark 分区投影/下推和模式推断
【发布时间】:2021-04-30 18:30:17
【问题描述】:

我想读取 JSON 格式的分区数据子集,使用 spark (3.0.1) 从 JSON 推断架构。

我的数据被分区为s3a://bucket/path/type=[something]/dt=2020-01-01/

当我尝试使用 read(json_root_path).where($"type" == x && $"dt" >= y && $"dt" <= z) 读取此内容时,spark 会尝试读取整个数据集以推断架构。

当我尝试提前找出我的分区路径并使用read(paths :_*) 传递它们时,spark 会抛出一个错误,它无法推断架构,我需要手动指定架构。 (请注意,在这种情况下,除非我指定 basePath,否则 spark 也会丢失 typedt 的列,但这很好,我可以忍受。)

我认为,我正在寻找的是一些选项,它告诉 spark 要么仅从相关分区推断架构,因此分区被下推,要么告诉它它可以仅从我给它的路径中的 JSON。请注意,我无法选择调用mcskglue 来维护配置单元元存储。此外,模式会随着时间而变化,因此无法提前指定 - 利用 Spark JSON 模式推断是一个明确的目标。

谁能帮忙?

【问题讨论】:

    标签: json apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您能否每天阅读您对使用模式推断感兴趣的内容,然后使用如下模式合并代码来合并数据帧:

    Spark - Merge / Union DataFrame with Different Schema (column names and sequence) to a DataFrame with Master common schema

    【讨论】:

      【解决方案2】:

      我想到的一种方法是从单个文件中提取您需要的架构,然后在您想要读取其他文件时强制它。

      由于您知道第一个分区和路径,请尝试先读取单个 JSON,例如 s3a://bucket/path/type=[something]/dt=2020-01-01/file_0001.json,然后提取架构。

      运行完整的阅读部分并将您提取的架构作为参数read(json_root_path).schema(json_schema).where(...传递

      架构应转换为StructType 才能被接受。

      我发现了一个可能对您有部分帮助的问题Create dataframe with schema provided as JSON file

      【讨论】:

        猜你喜欢
        • 2020-02-02
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        相关资源
        最近更新 更多