【问题标题】:Ignore unknown values on append在追加时忽略未知值
【发布时间】:2016-04-26 19:36:26
【问题描述】:

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

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

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

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

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

除非有人有具体原因说明未实施,否则我可能会提出功能请求。

谢谢!

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

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

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

    【讨论】:

    • 显然标志被指定为 --ignore_unknown_values
    【解决方案2】:

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

    【讨论】:

    • 非常感谢费利佩的回复;感谢 Google 团队如此密切地监控 SO。我实际上一直在尝试让它工作,但似乎无法弄清楚如何将数据上传到表中? JSON 是否需要解压缩? JSON 是否需要位于单个对象中?我拥有的数据是换行符分隔的,所以我猜这会给这个方法增加一些复杂性?
    • 新行分隔的 JSON 是完美的,您只需要像 .csv 一样导入它,并选择一个不同于逗号的分隔符(标签通常在 JSON 中适用于我)
    • 哇,这是一个非常有用的功能。非常感谢你的帮忙!只是出于好奇,是否有特定原因“忽略未知值”标志仅在表创建时可用,而不是在追加时可用?
    • 我不知道,但工程师喜欢功能请求code.google.com/p/google-bigquery/issues/… :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多