我的用例很簡單:從Pub/Sub訂閱中讀取事件日誌,解析它們並保存到BigQuery中。由於事件數量預計會顯着增加,我使用無限數據源,因此我決定在BigQuery中配置分片:根據事件數據的時間戳將事件存儲到日常表格中(Beam文檔中稱爲「事件時間」), 。 我的問題是我需要配置窗口在我的情況下,或者我可以保留隱式使用全局窗口的默認配置? 我問的原因是因爲我發現大部分BigQuery分片的例子都假設使用了窗口配置。但在我的情況下,因爲我沒有使用任何分組操作,如GroupByKey
和Combine
,看起來我應該沒問題,沒有任何窗口配置。或者是否有任何理由讓我使用窗口,或許它會影響BigQueryIO
如何執行?Apache Beam窗口和分片BigQuery輸出表格
我現在分片的方式如下。
static class TableNamingFn implements SerializableFunction<ValueInSingleWindow<TableRow>, TableDestination> {
@Override
public TableDestination apply(ValueInSingleWindow<TableRow> input) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd").withZone(DateTimeZone.UTC);
TableReference reference = new TableReference();
reference.setProjectId("test-project");
reference.setDatasetId("event_log");
DateTime timestamp = new DateTime(input.getValue().get("event_timestamp"), DateTimeZone.UTC);
reference.setTableId("events_" + formatter.print(timestamp));
return new TableDestination(reference, null);
}
}
// And then
eventRows.apply("BigQueryWrite", BigQueryIO.writeTableRows()
.to(new TableNamingFn())
.withSchema(EventSchema)
.withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND));
感謝您的回覆Victor。是的,我知道BigQuery中的分區表,我故意選擇不使用此功能,因爲單獨的表格方法對我來說更加靈活。我問的是,如果沒有任何分組操作或者仍然有很強的配置窗口的理由,可以不使用流式輸入窗口?在[示例](https://medium.com/google-cloud/bigquery-partitioning-with-beam-streams-97ec232a1fcc)中提到的窗口方式是使用的。 – dmitryb