为了账号安全,请及时绑定邮箱和手机立即绑定

将空值设置为缺失表字段的默认值

将空值设置为缺失表字段的默认值

米琪卡哇伊 2022-05-25 17:25:01
我正在使用 Java 和 SQL 将数据移动到新表中。我想要:从 BigQuery 中的旧表中提取数据更新/修改多个条目将其推送到 BigQuery 中的另一个现有表不幸的是,一些旧数据遵循不同的模式。一些旧表可能有从一到几百个缺失的列(字段)。我没有任何可靠的方法来生成或填充这些缺失的数据,所以我决定将其保留为空。如何添加具有默认空值的列?目前,我正在使用 SQL QueryJobConfiguration 来拉取、更新和推送数据到 BQ:QueryJobConfiguration queryConfig =             QueryJobConfiguration.newBuilder(               "SELECT  PARSE_TIMESTAMP('%b %d %T %Y', CONCAT(time, ' 2018')) MyTimestamp, * EXCEPT(time)"                + "FROM `myProject:MyDataset.MyTable` ")               .setUseLegacySql(false)               .setWriteDisposition(WriteDisposition.WRITE_APPEND)                   .setDestinationTable(TableId.of(MyOtherDataset, MyOtherTable))               .build();当我尝试运行它时,BigQuery 会抛出一个异常,声称数据缺少一列:线程“主”com.google.cloud.bigquery.BigQueryException 中的异常:架构更新无效。新架构中缺少字段 OtherField
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

经过一堆测试,我发现 BQ 不允许我推送,因为我有几个字段设置为“REQUIRED”而不是“NULLABLE”。我完全忘记了他们。幸运的是,BigQuery 有一个实验方法:setSchemaUpdateOptions。您可以像这样实现它:

List<SchemaUpdateOption> SchemaUpdate = Arrays.asList(JobInfo.SchemaUpdateOption.ALLOW_FIELD_RELAXATION);
.setSchemaUpdateOptions(SchemaUpdate)

ALLOW_FIELD_RELAXATION 本质上允许您在任何字段上用 NULLABLE 临时替换 REQUIRED 模式。


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信