2017-10-05 62 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來代替。你可以更新你設置你的表ID使用分區裝飾,喜歡的東西:

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

This article介紹使用BigQuery的分區表與Apache梁。特別是這段代碼可能是你想要使用的:https://gist.githubusercontent.com/alexvanboxel/902099911d86b6827c8ea07f4e1437d4/raw/cc8246eb9b3219550379cfe7b3b7abca8fc77401/medium_bq_tableref_partition

+0

感謝您的回覆Victor。是的,我知道BigQuery中的分區表,我故意選擇不使用此功能,因爲單獨的表格方法對我來說更加靈活。我問的是,如果沒有任何分組操作或者仍然有很強的配置窗口的理由,可以不使用流式輸入窗口?在[示例](https://medium.com/google-cloud/bigquery-partitioning-with-beam-streams-97ec232a1fcc)中提到的窗口方式是使用的。 – dmitryb