2

有没有办法使用创建日期分区表Apache Beam BigQueryIO,换句话说,有没有办法为尚未创建的表使用分区装饰器?

我知道我可以先创建一个表,然后我可以在我的代码中使用分区装饰器,但由于我动态确定TableDestination行的 from 字段,我无法提前创建这些表。

我的代码是这样的:

rows.apply("Write rows",
    BigQueryIO.writeTableRows()
      .to(new SerializableFunction<ValueInSingleWindow<TableRow>, TableDestination>() {
          @Override
          public TableDestination apply(ValueInSingleWindow<TableRow> value) {
            TableRow t = value.getValue();

            String tableName = ... // get from the fields of table row
            String partition = ... // get the date part that will be used for decorator

            TableDestination td = new TableDestination(
                      "project-id:dataset-id." + tableName + "$" + partition, "");
              return td;
          }
      }).withSchema(someSchema)
      .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
    .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED));

有了这个,它尝试创建一个表,project-id:dataset-id.tableName$partition并抱怨$不能在表名中使用。

4

2 回答 2

2

目前看来这是不可能的。

在官方的 BEAM JIRA 问题列表中对此有一个请求:BEAM-2390一个官方的拉取请求,所以看起来这将很快成为可能!

于 2017-06-08T07:14:42.437 回答
0

表 id 格式:The ID of the table. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.查看BigQuery 文档

于 2017-06-06T16:23:22.343 回答