我最喜欢的将 JSON 数据导入 BigQuery 的弹性方式:只需将完整的 JSON 字符串导入一列 BigQuery 表 - 稍后再解析。
我使用 Wikidata、AcousticBrainz、Wikipedia 更改日志等来执行此操作...
然后您可以创建一个视图来实时解析这些对象,或者反复实现它(以节省查询成本)。
我的维基百科更改日志视图,例如:
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
(您只需像导入 .csv 文件一样导入 json 文件,并选择不同于逗号的分隔符 - 制表符通常适用于我在 JSON 中)
Tl;dr: 1. 存储时不要解析。 2. 存储完整的 JSON 字符串。 3. 不再有数据丢失!