有没有办法使用 Apache Beam BigQueryIO 创建日期分区表,换句话说,有没有办法对尚未创建的表使用分区装饰器?
我知道我可以首先创建一个表,然后可以在代码中使用分区装饰器,但由于我从行字段动态确定 TableDestination
,所以我无法提前创建这些表。
我的代码是这样的:
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
表,并提示 $
不能在表名中使用.
最佳答案
目前看来这是不可能的。
官方 BEAM JIRA 问题列表中有一个对此的请求:BEAM-2390和 an official pull request ,看来这很快就会成为可能!
关于google-bigquery - 以编程方式创建日期分区表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44389862/