2017-07-18 40 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

只是爲了清楚元數據將是一個字符串字段。名稱和電子郵件不需要單獨的字段? –