如何在 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_EXTRACT
和JSON_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表中时管理/处理架构更改