有没有办法使用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
的表,并抱怨$
不能在表名中使用。
答案 0 :(得分:2)
目前看来这是不可能的。
在官方BEAM JIRA问题列表中有一个请求:https://www.w3schools.com/sql/sql_view.asp和BEAM-2390,所以看起来这很快就会出现!
答案 1 :(得分:0)
表格格式: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 doc。