2017-02-06 20 views
2

我試圖將JSON數據加載到BigQuery。我的數據造成問題的摘錄看起來像這樣:將JSON加載到bigquery - 字段有時是數組,有時是字符串

{"page":"295"} 
{"page":["295", "123"]} 

我已經定義架構這一領域是:

{ 
    "name": "page", 
    "type": "string", 
    "mode": "repeated" 
} 

我得到重複場」的錯誤,必須導入爲JSON數組「。我認爲這個問題是由JSON本身的結構造成的。第一行中的字符串應該是1個元素數組,而不僅僅是一個字符串。數據是這樣傳遞給我的。我試圖找到一種方法來強制BigQuery將該字符串作爲一個元素數組讀取,而不是修復該文件(這是百兆字節)。有沒有解決方法?

回答

1

一種選擇是使用BigQuery來轉換數據本身。假設您可以將行導入爲CSV而不是數據(可以選擇未出現在數據中的任意分隔符),您可以使用JSON_EXTRACT函數跨行檢索page的值。例如,

#standardSQL 
SELECT JSON_EXTRACT(json, '$.page') AS page 
FROM UnprocessedTable; 

可以使用SPLIT功能或REGEXP_EXTRACT_ALL爲後來檢索單個值。

編輯:作爲一個具體的例子,你可以試試這個查詢:

#standardSQL 
WITH T AS (
    SELECT '{"page": "foo"}' AS json UNION ALL 
    SELECT '{"page": ["bar", "baz"]}' AS json UNION ALL 
    SELECT '{"page": ["a", "b", "c"]}' AS json 
) 
SELECT 
    REGEXP_EXTRACT_ALL(JSON_EXTRACT(json, '$.page'), r'"([^"]*)"') AS pages 
FROM T; 

這將返回JSON陣列(或標串)作爲ARRAY<STRING>列。

+0

謝謝!這確實可能奏效。問題是我的數據實際上包含了像60列。給出的例子只是造成問題的列。我應該早點提到它。我是否正確,加載整個數據集爲CSV後,我需要分別提取每個列,即使那些現在正常工作? – Mikolaj

+0

您可以通過編程方式爲每個其他列調用「JSON_EXTRACT_SCALAR」。至少,您應該只需要對數據進行一次這種轉換。 –

+0

謝謝。另一種適用於我的解決方案是將整個數組「'」295「,」123「]作爲字符串加載。這是否有可能?會更容易嗎? – Mikolaj

相關問題