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

Posted

技术标签:

【中文标题】将空值设置为缺失表字段的默认值【英文标题】:Set Null Value as Default for Missing Table Fields 【发布时间】:2019-01-28 20:57:29 【问题描述】:

我正在使用 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 会引发异常,声称数据缺少一列:

线程“main”com.google.cloud.bigquery.BigQueryException 中的异常:架构更新无效。新架构中缺少字段 OtherField

【问题讨论】:

【参考方案1】:

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

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

ALLOW_FIELD_RELAXATION 实质上允许您将任何字段上的 REQUIRED 模式临时替换为 NULLABLE。

【讨论】:

以上是关于将空值设置为缺失表字段的默认值的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE中创建如何创建表,并设置结构和默认值

将空值设置为列表中最接近的最后一个非空值 - LINQ

Prometheus 来源的时间序列:如何将空值设置为零?

如何将SAS数据集中全部为空值的变量删除

如何将空值存储为整数字段

如何使用 LINQ 将空值发送到 ASP.NET 中的非空列