我有一个 BigQuery 表,其中包含由结构化数据 (RECORD) 组成的 REPEATED 字段,该字段仅由两个键组成:KEY 和 VALUE。它看起来像这样:
[{"KEY":"TESTING_FLAG", "VALUE": "TRUE"},{"KEY":"THRESHOLD", "VALUE": "10"}]
我编写了一个 Apache Beam java 作业,该作业应该通过将其作为 parquet 写入 GCS 来处理等效字段,并在 parquet 文件之上构建一个外部表。然而,架构看起来像这样:
我担心这可能无法忠实地代表我们最初在本机 BigQuery 表中拥有的相同数据类型。我们向 Beam 作业传递了一个 avro 模式,该模式将字段定义为:
{
"name": "DS_GUARDRAILS",
"type": [
"null",
{
"type": "array",
"items": {
"type": "record",
"name": "DS_GUARDRAIL",
"fields": [
{
"name": "KEY",
"type": "string"
},
{
"name": "VALUE",
"type": "string"
}
]
}
}
],
"default": null
},
我应该采取不同的做法来模仿原始结构吗?或者这只是 BigQuery 通过外部表表示这种类型的镶木地板数据的怪癖?
您发布的 avro 架构在技术上比原始 BigQuery 架构提供了额外的自由度。因为 BigQuery 不允许存储空列表。我猜想,删除 Beam avro 模式中的可空性将使两者对齐(尽管对 Beam 不太熟悉)。
另一个可用于模式对齐的选项是覆盖 parquet 接收器的 parquet-mr 值 WRITE_OLD_LIST_STRUCTURE 并在外部表上使用 set enable_list_inference