在将JSON blob附加到BigQuery中的现有表时,我遇到了一些问题;特别是,附加的JSON中存在新的但不是必需的叶元素会阻止我附加数据。
使用UI,我可以使用Google Cloud Storage中的JSON文件创建表格,在描述架构后,我可以选择“忽略未知值”。从定义:
启用接受包含与架构不匹配的值的行。未知值将被忽略。
这对于从GCS创建和导入的初始表非常有效,并且是我希望继续用于追加的功能。但是,当我尝试使用bq命令行工具将数据附加到表时,我收到的错误是JSON blob的各个叶元素不属于模式。
有没有人遇到过类似的问题?有快速解决?我知道我可以预处理JSON本身来删除我不需要的元素,但我觉得“Ignore Unknown Values”应该是命令行标志。
除非某人有特定原因未实施此功能,否则我可以提交功能请求。
谢谢!
答案 0 :(得分:4)
使用命令行选项:--ignore-unknown-values
使用bq load --help
查看您的所有选项。
答案 1 :(得分:2)
我最喜欢的将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一样,并选择一个不同于逗号的分隔符 - tab通常适用于JSON内部)
Tl; dr:1。存储时不要解析。 2.存储完整的JSON字符串。 3.不再有数据丢失!