2017-10-05 18 views
1

私の使用例は単純です:Pub/Subサブスクリプションからイベントログを読み込み、解析してBigQueryに保存します。イベントの数が大幅に増え、無制限のデータソースで作業するため、BigQueryでシャーディングを設定することにしました。イベントデータからのタイムスタンプ(Beamドキュメントの「イベント時刻」と呼ばれる)に基づいて、 。 私が持っている質問は私のケースではウィンドウ構成を構成する必要があるのですか?暗黙的にグローバルウィンドウを使用する既定の構成をそのまま使うことができますか? 私が求めているのは、BigQueryシャーディングの例のほとんどが、ウィンドウ構成の使用を想定しているからです。しかし、私の場合は、グループ化操作をGroupByKeyCombineとして使用していないため、ウィンドウ構成がなくてもうまくいくはずです。または、とにかくウィンドウを使用する理由がありますか?たとえば、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)); 

答えて

1

日付でテーブルをシャードしようとしているように見え、あなたの代わりにDate-partitioned Tableを使用して検討しました。

reference.setTableId("events$" + formatter.print(timestamp)); 

This article ApacheのビームとのBigQueryのパーティション表を使って説明します。パーティションのデコレータを使用して、あなたのテーブルIDを設定する場所あなたのような何かが、更新できます。特にこのコードスニペットは、おそらくあなたが使いたいものです:https://gist.githubusercontent.com/alexvanboxel/902099911d86b6827c8ea07f4e1437d4/raw/cc8246eb9b3219550379cfe7b3b7abca8fc77401/medium_bq_tableref_partition

+0

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

関連する問題