Google cloud platform BigQueryIO-Can';如果无边界PCollection和文件加载需要,请不要将DynamicDestination与CREATE_一起使用

Google cloud platform BigQueryIO-Can';如果无边界PCollection和文件加载需要,请不要将DynamicDestination与CREATE_一起使用,google-cloud-platform,google-bigquery,google-cloud-dataflow,apache-beam,Google Cloud Platform,Google Bigquery,Google Cloud Dataflow,Apache Beam,我的工作流程:KAFKA->Dataflow streaming->BigQuery 考虑到低延迟在我的情况下并不重要,我使用文件加载来降低成本。我正在使用BigQueryIO。使用DynamicDestination(每小时一个新表,以当前小时为后缀)编写 此BigQueryIO.Write的配置如下: .withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED) .withMethod(Method.FILE_LOADS) .withT

我的工作流程:KAFKA->Dataflow streaming->BigQuery

考虑到低延迟在我的情况下并不重要,我使用文件加载来降低成本。我正在使用BigQueryIO。使用DynamicDestination(每小时一个新表,以当前小时为后缀)编写

此BigQueryIO.Write的配置如下:

.withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED)
.withMethod(Method.FILE_LOADS)
.withTriggeringFrequency(triggeringFrequency)
.withNumFileShards(100)
第一个表已成功创建并写入。但是,以下表格从未创建,我得到了以下例外情况:

(99e5cd8c66414e7a): java.lang.RuntimeException: Failed to create load job with id prefix 5047f71312a94bf3a42ee5d67feede75_5295fbf25e1a7534f85e25dcaa9f4986_00001_00023, reached max retries: 3, last failed load job: {
  "configuration" : {
    "load" : {
      "createDisposition" : "CREATE_NEVER",
      "destinationTable" : {
        "datasetId" : "dev_mydataset",
        "projectId" : "myproject-id",
        "tableId" : "mytable_20180302_16"
      },
对于第一个表,使用的CreateDisposition是CREATE_(如果指定需要),但不考虑此参数,默认情况下从不使用CREATE_

我还在JIRA上创建了。

根据,方法
BigQueryIO.Write.CreateDisposition
要求使用when CREATE\u IF\u NEEDED提供表模式

如本文件所述:

请注意,如果指定CREATE_if_NEEDED作为CreateDisposition和 如果不提供表模式,转换可能会在运行时失败 如果目标表不存在,则返回java.lang.IllegalArgumentException 存在。

文档说明的错误与您收到的错误不同(您得到的是
java.lang.RuntimeException
),但根据您共享的
BigQueryIO.Write()
配置,您没有指定任何表架构,因此,如果缺少表,作业很容易失败

因此,作为解决问题的第一个措施,您应该创建与要加载到BQ中的数据相匹配的表模式
TableSchema()
,然后相应地使用前提条件
。使用模式(schema)

List<TableFieldSchema> fields = new ArrayList<>();
// Add fields like:
fields.add(new TableFieldSchema().setName("<FIELD_NAME>").setType("<FIELD_TYPE>"));
TableSchema schema = new TableSchema().setFields(fields);

// BigQueryIO.Write configuration plus:
    .withSchema(schema)
List fields=new ArrayList();
//添加如下字段:
添加(新的TableFieldSchema().setName(“”).setType(“”);
TableSchema schema=new TableSchema().setFields(字段);
//BigQueryIO.写入配置plus:
.withSchema(schema)
这是Beam中的一个错误:

它在2.27版中仍然是开放的

我开发了一个变通方法:我编写了一个自定义pttransform,它在BigqueryIO.Write阶段之前创建了一个空表。它使用BigQueryJava客户机。你可以在这里看到它来获得灵感:

很抱歉,我没有指定它,因为我认为它不相关,但我确实使用
.withJsonSchema()
指定了一个模式,创建第一个表效果很好。问题似乎是除了第一个窗格中的表之外,其他表的
CREATE\u DISPOSITION
被忽略。有关更多详细信息,请参阅JIRA问题。它看起来确实可能与您的问题有关。这就是为什么我认为可以在您共享的Apache Beam论坛中更好地跟踪这个问题,因为我不知道是否有办法强制在第一个窗格中创建每个新表,以便它可以使用定义的
CreateDisposition
。一旦问题解决了,请随意在这篇文章中发布答案。谢谢我在Beam 2.6.0和2.9.0中遇到了相同的问题。我还可以创建第一个表,但不能创建以下任何一个表。错误消息与原始帖子中的消息完全相同。我在帖子中评论了一个失败的示例代码。