2016-04-26 74 views
1

在将一个JSON blob附加到BigQuery中的现有表时,我遇到了一些问题;具体而言,在附加的JSON中存在新的但并非必要的叶元素阻止了我追加数据。忽略追加的未知值

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

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

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

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

除非有人有特定的原因,否则我可能会提交功能请求。

谢谢!

回答

1

我最喜欢的将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.不再有数据丢失!

+0

非常感谢Felipe的回复;非常感谢Google团队的监控。我实际上一直试图让这个工作,但似乎无法弄清楚如何将数据上传到表中? JSON需要解压缩吗? JSON是否需要在单个对象中?我所拥有的数据是换行符,因此我猜这为这种方法增加了一些复杂性? – andre622

+0

新行分隔JSON是完美的,你只需要将它导入,就好像它是.csv一样,并选择一个不同于逗号的分隔符(标签通常适用于JSON内部的我) –

+0

哇,这是一个令人难以置信的有用的功能。非常感谢你的帮助!出于好奇,是否有一个特定的原因,“忽略未知值”标志仅在创建表时可用,而不是追加? – andre622

1

使用命令行选项:--ignore-unknown-values

使用bq load --help来查看所有选项。

+0

显然该标志被指定为--ignore_unknown_values – Elmer