2016-04-26 42 views
1

在將一個JSON blob附加到BigQuery中的現有表時,我遇到了一些問題;具體而言,在附加的JSON中存在新的但並非必要的葉元素阻止了我追加數據。忽略追加的未知值

使用UI,我可以使用Google雲端存儲中的JSON文件創建表格,並且在描述架構之後,我可以選擇「忽略未知值」。從定義:

啓用接受包含與模式不匹配的值的行。未知值將被忽略。

這對從GCS初始表創建和導入非常有效,並且是我希望繼續用於附加的功能。但是,當我嘗試使用bq命令行工具將數據附加到表中時,出現錯誤,使得JSON blob的單個葉元素不屬於該模式。

有沒有人遇到類似的問題?有一個快速解決?我知道我可以預處理JSON本身來刪除我不需要的元素,但我覺得「忽略未知值」應該是命令行標誌。

除非有人有特定的原因,否則我可能會提交功能請求。

謝謝!

回答

1

我最喜歡的將JSON數據導入BigQuery的彈性方式:只需將完整的JSON字符串導入一列BigQuery表 - 稍後解析它。

我這樣做與維基數據,AcousticBrainz,維基百科更改日誌,等等

然後你就可以創建一個視圖來解析實時這些對象時間,或者重複實現它(爲了節省查詢成本)。

我的維基百科更改日誌視圖,例如:

SELECT 
    JSON_EXTRACT_SCALAR(object, '$[0].wiki') wiki, 
    JSON_EXTRACT_SCALAR(object, '$[0].comment') comment, 
    JSON_EXTRACT_SCALAR(object, '$[0].server_name') server_name, 
    JSON_EXTRACT_SCALAR(object, '$[0].server_script_path') server_script_path, 
    INTEGER(JSON_EXTRACT_SCALAR(object, '$[0].namespace')) namespace, 
    JSON_EXTRACT_SCALAR(object, '$[0].title') title, 
    'true'=JSON_EXTRACT_SCALAR(object, '$[0].bot') bot, 
    JSON_EXTRACT_SCALAR(object, '$[0].server_url') server_url, 
    INTEGER(JSON_EXTRACT_SCALAR(object, '$[0].length.new')) length_new, 
    INTEGER(JSON_EXTRACT_SCALAR(object, '$[0].length.old')) length_old, 
    JSON_EXTRACT_SCALAR(object, '$[0].user') user, 
    INTEGER(JSON_EXTRACT_SCALAR(object, '$[0].timestamp')) timestamp, 
    JSON_EXTRACT_SCALAR(object, '$[0].type') type, 
    INTEGER(JSON_EXTRACT_SCALAR(object, '$[0].id')) id, 
    'true'=JSON_EXTRACT_SCALAR(object, '$[0].minor') minor, 
    INTEGER(JSON_EXTRACT_SCALAR(object, '$[0].revision.new')) revision_new, 
    INTEGER(JSON_EXTRACT_SCALAR(object, '$[0].revision.old')) revision_old, 
FROM [wikipediaEdits.changelog_objects] 

要加載JSON字符串,不解析它,我做這樣的事情:

bq load --replace -F "tab" \ 
    fh-bigquery:test_acousticbrainz.lowlevel \ 
    gs://fh-datalab-musicbrainz/acousticbrainz/acousticbrainz-lowlevel* item 

(你只需要導入JSON文件就好像它是一個.csv,並選擇一個不同於逗號的分隔符 - 標籤通常適用於我內部的JSON)

Tl; dr:1.存儲時不要解析。 2.存儲完整的JSON字符串。 3.不再有數據丟失!

+0

非常感謝Felipe的回覆;非常感謝Google團隊的監控。我實際上一直試圖讓這個工作,但似乎無法弄清楚如何將數據上傳到表中? JSON需要解壓縮嗎? JSON是否需要在單個對象中?我所擁有的數據是換行符,因此我猜這爲這種方法增加了一些複雜性? – andre622

+0

新行分隔JSON是完美的,你只需要將它導入,就好像它是.csv一樣,並選擇一個不同於逗號的分隔符(標籤通常適用於JSON內部的我) –

+0

哇,這是一個令人難以置信的有用的功能。非常感謝你的幫助!出於好奇,是否有一個特定的原因,「忽略未知值」標誌僅在創建表時可用,而不是追加? – andre622

1

使用命令行選項:--ignore-unknown-values

使用bq load --help來查看所有選項。

+0

顯然該標誌被指定爲--ignore_unknown_values – Elmer