【问题标题】:How to manage/handle schema changes while loading JSON file into BigQuery table如何在将 JSON 文件加载到 BigQuery 表中时管理/处理架构更改
【发布时间】:2018-07-31 21:00:40
【问题描述】:

这是我的输入文件的样子:

{"Id": 1, "Address": {"Street":"MG Road","City":"Pune"}}
{"Id": 2, "Address": {"City":"Mumbai"}}
{"Id": 3, "Address": {"Street":"XYZ Road"}}
{"Id": 4}
{"Id": 5, "PhoneNumber": 12345678, "Address": {"Street":"ABCD Road", "City":"Bangalore"}}

在我的数据流管道中,我如何动态确定每行中存在哪些字段以符合 BigQuery 表架构。 例如,在第 2 行中,Street 缺失。我希望 BigQuery 中列 Address.Street 的条目为 "N/A"null,并且不希望管道因架构更改或丢失数据而失败。

在使用 Python 写入 BigQuery 之前,如何在我的数据流作业中处理此逻辑?

【问题讨论】:

  • 您是否尝试在您的表中插入此类数据?根据我的经验(BQ 流式传输或 Avro,但不是 JSON),如果要插入的数据缺少某些列,并且 BQ 的 DDL 已将此列标记为 Nullable,则将插入该行并将缺少的列标记为 Null .

标签: python google-cloud-platform google-bigquery google-cloud-functions google-cloud-dataflow


【解决方案1】:

我建议将您的数据写入临时表,其中只有一个 line 类型为 string 的字段

完成将数据导入 BigQuery 临时表后 - 现在您可以应用架构逻辑并将临时表中的数据查询到最终表中

以下示例是 BigQuery 标准 SQL,说明如何对一个字段中包含整行的表应用架构逻辑

#standardSQL
WITH t AS (
  SELECT '{"Id": 1, "Address": {"Street":"MG Road","City":"Pune"}}' line UNION ALL
  SELECT '{"Id": 2, "Address": {"City":"Mumbai"}}' UNION ALL
  SELECT '{"Id": 3, "Address": {"Street":"XYZ Road"}}' UNION ALL
  SELECT '{"Id": 4}  ' UNION ALL
  SELECT '{"Id": 5, "PhoneNumber": 12345678, "Address": {"Street":"ABCD Road", "City":"Bangalore"}}' 
)
SELECT
  JSON_EXTRACT_SCALAR(line, '$.Id') id,
  JSON_EXTRACT_SCALAR(line, '$.PhoneNumber') PhoneNumber,
  JSON_EXTRACT_SCALAR(line, '$[Address].Street') Street,
  JSON_EXTRACT_SCALAR(line, '$[Address].City') City 
FROM t  

结果如下

Row id  PhoneNumber Street      City     
1   1   null        MG Road     Pune     
2   2   null        null        Mumbai   
3   3   null        XYZ Road    null     
4   4   null        null        null     
5   5   12345678    ABCD Road   Bangalore      

【讨论】:

    猜你喜欢
    • 2017-01-03
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2011-08-11
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多