【问题标题】:Schema-less JSON to Apache Beam "Row" type?无模式 JSON 到 Apache Beam“行”类型?
【发布时间】:2023-04-01 12:24:01
【问题描述】:

有没有办法使用 Java SDK 将任意 schema-less JSON 字符串转换为 Apache Beam“行”类型?如果不是,是否可以从现有 Object 派生 Beam Schema 类型?

我找到了 JsonToRowParseJsons 的文档,但它们要么需要提供 Schema 或 POJO 类才能工作。我还发现您可以将 JSON 字符串读入 BigQuery TableRow,但似乎没有一种方法可以将 TableRow 转换为不涉及已有架构的 Row。

【问题讨论】:

    标签: java apache-beam


    【解决方案1】:

    不,这是不可能的,因为 Row(以及使用它的框架)需要在构建时了解架构。选项是在构建时读取一小部分数据以推断您的架构,并使用它来调用您的 JsonToRow 转换。

    【讨论】:

      【解决方案2】:

      不幸的是,一般的答案似乎是“否”,尽管在某些特定情况下答案可能是“是”。

      问题在于 Schema 不是 100% 兼容 JSON 数据类型,特别是因为 ARRAY 字段类型。
      在 JSON 中,列表的元素可能具有不同的数据类型,但 Beam 中的 Schema 要求每个元素都属于 ARRAY,才能为 same 类型。此类型可以是另一个 ROW,甚至可以是 logical type,但所有元素必须相同。
      不幸的是,使用 ROW 替换 ARRAY 并不完全有效。尽管 ROW 字段是位置字段,但它们也被命名,使它们更接近于 MAP。此外,如果您的数据集包含不同长度的 JSON 列表,您最终会导致每一行都有不同的架构,这将产生不良后果。

      因此,如果您的 JSON 数据不使用任意类型的列表,您应该没问题。也就是说,Beam 没有提供任何用于从 JSON 派生模式的实用程序,因此您需要自己创建该解决方案。

      【讨论】:

      • 关于 ARRAY 限制,是否可以使用 OneOf 类型绕过它(遗憾的是仅限于 Java)? beam.apache.org/documentation/programming-guide/#oneoftype
      • 理论上可以,但是您需要一个 OneOf 类型,其中包括所有基本类型和所有可能出现在 Array 中的 Record 类型。虽然可能,但这将是一团糟。
      • @mr-llama,同意。这很粗糙。
      【解决方案3】:

      我在工作中遇到了这种确切的情况,我赞同你所说的关于有限 JSON 处理选项的一切。事实证明,Beam 确实提供了可以convert a BigQuery TableRow/TableSchema to Beam Row/Schema 的东西。如果您选择它作为您的架构并继续使用 JsonToRow,您将需要弥合 BigQueryUtils.fromTableSchema(BYTES、DATETIME、logical types generated by BigQueryUtils)生成的 JSON 和 Beam 数据类型之间的数据类型阻抗不匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 2020-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多