【问题标题】:BigQuery append results of query to table with Required fieldsBigQuery 将查询结果附加到具有必填字段的表中
【发布时间】:2016-09-09 16:16:52
【问题描述】:

我正在尝试将查询结果附加到与查询结果具有相同架构的现有表中,但现有表中的某些字段是必需的。

这是我尝试运行查询时所有必填字段的错误:

Invalid schema update. Field user has changed mode from REQUIRED to NULLABLE

当我将查询结果写入新表时,它的所有字段都具有相同的名称和类型,但是所有字段的模式都是 NULLABLE(1 个重复字段除外)。我已经尝试对所有必填字段使用AND user IS NOT NULL,但没有成功。我还尝试将查询结果保存到单独的表中,然后修改其架构,但 BQ 不允许在表上追溯设置必填字段。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    标准 SQL 不再支持必需字段。如果您使用的是标准 SQL(而不是旧版 SQL),他们建议您使用change all your REQUIRED fields to NULLABLE。

    编辑(2017 年 10 月 23 日):看起来他们增加了对 REQUIRED fields in Standard SQL 的支持。

    【讨论】:

    【解决方案2】:

    FWIW,我发现使用模式创建表,然后查询它指定相同的模式,确实有效。像这样:

    bq mk --schema=myschema.json me.newstuff &&
    bq query --format=none --allow_large_results \
      --destination_table=me.newstuff \
      --destination_schema=myschema.json \
      --use_legacy_sql=false \
      "
        SELECT * FROM me.oldstuff
        WHERE data_to_keep is > 0
    "
    

    【讨论】:

      【解决方案3】:

      您无法更改查询结果的架构以将 NULLABLE 翻转为 REQUIRED,因此您唯一可以做的就是更改表的架构以将 REQUIRED 列转换为 NULLABLE(注意 - 如果您这样做,您将不会以后可以做相反的操作)。

      【讨论】:

      • 因此基本上不可能通过查询具有必填字段的表来追加到表中......这似乎有点疏忽。我能想到的唯一方法是将数据作为 CSV 导出到 GCS,然后执行加载工作。
      • 在某些情况下查询产生 REQUIRED 字段是可能的,但一般情况下不会。在我看来,REQUIRED 弊大于利,所以我只需将架构更改为对所有字段都为 NULLABLE。
      • 我的表已经生成并写入了 REQUIRED 字段,所以我无法真正切换现有的表。
      • 您可以将现有表的架构从 REQUIRED 更改为 NULLABLE 而无需触及数据 - 这是一个兼容的架构更改。
      【解决方案4】:

      当我使用bq load 命令加载时,我收到了相同的错误“字段已将模式从 REQUIRED 更改为 NULLABLE”。我解决的方法是更改​​架构。将字段从“REQUIRED”更改为“NULLABLE”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-07
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多