2017-07-18 135 views
1

我的数据是这样的: 行1 - {"id": "1", "object": "user","metadata": {"name": "1234"}} 行2 - {"id": "1", "object": "user","metadata": {"name": "1234","email": "[email protected]"}}如何处理动态模式BigQuery中

我使用行1 metadata RECORD NULLABLE metadata.tenant STRING NULLABLE object STRING NULLABLE id STRING NULLABLE

创建的表,但我的插入会失败在行2.我的模式应该是什么样子,以便它可以处理元数据字段中的更改?

+0

@ElliottBrossard你能帮忙吗? –

+1

即使第一行不存在,您是否可以在'metadata'中仅包含'email'作为字段?或者你是否说'元数据'里面还有其他可能的字段? –

+0

添加电子邮件将无济于事。元数据中可以有其他字段。 –

回答

2

对于你的问题所示的例子 - 我会在下面的模式去

[ 
    { 
    "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": "[email protected]"}' 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  [email protected] 
2 expert Elliott Brossard null  
+0

如果元数据中有新字段会怎么样?而如果新的领域是一个数组呢? –

+1

它只是字符串,所以仍然会工作!不管添加了多少新字段 - 要提取它们,只需要在JSON_EXTRACT函数中调整JSON PATH即可。那简单! –

+0

只是为了清楚元数据将是一个字符串字段。名称和电子邮件不需要单独的字段? –