我最喜歡的將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.不再有數據丟失!
非常感謝Felipe的回覆;非常感謝Google團隊的監控。我實際上一直試圖讓這個工作,但似乎無法弄清楚如何將數據上傳到表中? JSON需要解壓縮嗎? JSON是否需要在單個對象中?我所擁有的數據是換行符,因此我猜這爲這種方法增加了一些複雜性? – andre622
新行分隔JSON是完美的,你只需要將它導入,就好像它是.csv一樣,並選擇一個不同於逗號的分隔符(標籤通常適用於JSON內部的我) –
哇,這是一個令人難以置信的有用的功能。非常感謝你的幫助!出於好奇,是否有一個特定的原因,「忽略未知值」標誌僅在創建表時可用,而不是追加? – andre622