私の使用例は単純です: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));
返信いただきありがとうございます。はい、私はBigQueryのパーティションテーブルについて知っています。私は別のテーブルアプローチでは、この機能を使用しないように意図的に選択しました。しかし、グループ化操作がないときや、ウィンドウ処理を設定する強い理由があるときに、ストリーミング入力でウィンドウ処理を使用しないことが良いのであれば、私は尋ねていました。 [例](https://medium.com/google-cloud/bigquery-partitioning-with-beam-streams-97ec232a1fcc)には、ウィンドウイングが言及されていると書かれています。 – dmitryb