如何在 bigquery 中处理动态架构

Posted

技术标签:

【中文标题】如何在 bigquery 中处理动态架构【英文标题】:How to handle dynamic schema in bigquery 【发布时间】:2017-07-18 22:46:46 【问题描述】:

我的数据如下所示: 第 1 行 - "id": "1", "object": "user","metadata": "name": "1234" 第 2 行 - "id": "1", "object": "user","metadata": "name": "1234","email": "abc@abc.com"

我使用第 1 行创建了表格 metadata RECORD NULLABLE metadata.tenant STRING NULLABLE object STRING NULLABLE id STRING NULLABLE

但是我的插入将在第 2 行失败。我的架构应该是什么样子才能处理元数据字段中的更改?

【问题讨论】:

@ElliottBrossard 你能帮忙吗? 您能否将email 作为字段包含在metadata 中,即使第一行不存在它?或者您是说metadata 中可能还有其他字段? 添加电子邮件无济于事。元数据中可以有其他字段。 最好的办法是让metadata 成为一个字符串列,并在这种情况下使用JSON_EXTRACTJSON_EXTRACT_SCALAR 函数。 同意 Elliott - 这就是要走的路。但请确保您的字符串是有效的 JSON,否则您将无法使用 JSON_EXTRACT... 函数。这么说是因为在您之前的示例中 - 这不是一个案例! 【参考方案1】:

对于您问题中显示的示例 - 我将使用以下架构

[
  
    "name": "id",
    "type": "INTEGER",
    "mode": "NULLABLE"
  ,
  
    "name": "object",
    "type": "STRING",
    "mode": "NULLABLE"
  ,
  
    "name": "metadata",
    "type": "STRING",
    "mode": "NULLABLE"
  
]   

下面是我如何处理它的示例

#standardSQL
WITH `yourProject.yourDataset.yourTable` AS (
  SELECT 1 AS id, 'user' AS object, '"name": "BI Architect", "email": "abc@abc.com"' AS metadata UNION ALL
  SELECT 2, 'expert', '"name": "Elliott Brossard"'
)
SELECT 
  id, 
  object, 
  JSON_EXTRACT_SCALAR(metadata, '$.name') AS name,
  JSON_EXTRACT_SCALAR(metadata, '$.email') AS email 
FROM `yourProject.yourDataset.yourTable` 
ORDER BY id

导致以下输出

id  object  name                email    
1   user    BI Architect        abc@abc.com  
2   expert  Elliott Brossard    null     

【讨论】:

元数据中有新字段怎么办?如果新字段是一个数组呢? 它只是字符串,所以仍然可以工作!无论添加多少新字段 - 要提取它们,您只需要在 JSON_EXTRACT 函数中调整 JSON PATH。就这么简单! 只是为了清楚元数据将是一个字符串字段。姓名和电子邮件不需要是单独的字段吗? 谢谢。还有一件事。我正在使用 python json.dumps(value) if key in ('metadata'): row[key] = json.dumps(value) 生成字符串 只是尝试,如果在解决它时有任何问题 - 发布新的具体问题。希望您对 SO 的工作方式更加熟悉。同时-如果我的回答有帮助并且您接受了它-也请考虑投票-这对SO很重要。这会提高您自己的声誉得分,同时让我们有动力回答您的下一个问题:o) 请考虑!

以上是关于如何在 bigquery 中处理动态架构的主要内容,如果未能解决你的问题,请参考以下文章

如何在将JSON文件加载到BigQuery表中时管理/处理架构更改

如何在 Google bigquery 中为多个动态表创建授权视图?

如何在 Google BigQuery 中管理架构迁移

如何在 BigQuery 架构中设置 FLOAT 的精度

如何在Google BigQuery中管理架构迁移

使用自动检测的动态 BigQuery 架构:错误架构没有字段