无模式JSON到Apache Beam“行”类型?

问题描述

是否有一种使用Java SDK将任意无模式的JSON字符串转换为Apache Beam“行”类型的方法?如果不是,是否有可能从现有对象派生Beam Schema类型?

我已经找到了JsonToRowParseJsons的文档,但是它们要么需要提供Schema,要么需要提供POJO类才能工作。我还发现,您可以将JSON字符串读取到BigQuery TableRow中,但似乎没有将TableRow转换为Row的方法,而该方法不涉及已经拥有模式。

解决方法

否,这是不可能的,因为Row(以及使用它的框架)要求在构造时知道该架构。在构建时,on选项是读取一小部分数据以推断出架构,然后使用它来调用JsonToRow转换。

,

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

,

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

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

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