忽略附加

时间:2016-04-26 19:36:26

标签: google-bigquery

在将JSON blob附加到BigQuery中的现有表时,我遇到了一些问题;特别是,附加的JSON中存在新的但不是必需的叶元素会阻止我附加数据。

使用UI,我可以使用Google Cloud Storage中的JSON文件创建表格,在描述架构后,我可以选择“忽略未知值”。从定义:

  

启用接受包含与架构不匹配的值的行。未知值将被忽略。

这对于从GCS创建和导入的初始表非常有效,并且是我希望继续用于追加的功能。但是,当我尝试使用bq命令行工具将数据附加到表时,我收到的错误是JSON blob的各个叶元素不属于模式。

有没有人遇到过类似的问题?有快速解决?我知道我可以预处理JSON本身来删除我不需要的元素,但我觉得“Ignore Unknown Values”应该是命令行标志。

除非某人有特定原因未实施此功能,否则我可以提交功能请求。

谢谢!

2 个答案:

答案 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.不再有数据丢失!