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

时间:2019-01-28 20:57:29

标签: java sql google-bigquery

我正在使用Java和SQL将数据移动到新表中。我要:

  1. 从BigQuery中的旧表中提取数据
  2. 更新/修改多个条目
  3. 将其推送到BigQuery中的另一个现有表上

不幸的是,一些旧数据遵循不同的模式。一些旧表可能缺少一列到几百个丢失的列(字段)。我没有任何可靠的方式来生成或填写此丢失的数据,因此我决定将其保留为空。如何添加具有默认null值的列?

此刻,我正在使用SQL QueryJobConfiguration将数据提取,更新和推回BQ:

let mockMediaSubject: BehaviorSubject<MediaChange>;
...
beforeEach(() => {
   mockMediaSubject = new BehaviorSubject({});
   TestBed.configureTestModule({
      ...
      providers: [ 
         { 
             provide: MediaObserver, 
             useValue: { media$: mockMediaSubject.asObservable() }
         }
      ]
   });
});

...
it("should set stackFooter to true when media$ emits 'xs' as mqAlias", () => {
   mockMediaSubject.next({mqAlias: 'xs'});

   expect(componentInstance.stackFooter).toBeTruthy();
});
...
it("should set stackFooter to true when media$ emits 'sm' as mqAlias", () => {
   mockMediaSubject.next({mqAlias: 'sm'});

   expect(componentInstance.stackFooter).toBeTruthy();
});

当我尝试运行此代码时,BigQuery引发异常,声称数据缺少列:

  

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

1 个答案:

答案 0 :(得分:0)

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

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

ALLOW_FIELD_RELAXATION实际上使您可以用NULLABLE临时替换任何字段上的REQUIRED模式。