我最喜欢的将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