簡體   English   中英

是否可以根據窗口元素的時間戳動態生成BigQuery表名?

[英]Is it possible to dynamically generate BigQuery table names based on the timestamps of the elements of a window?

例如,如果我有一個從PubSub讀取的5分鍾窗口的數據流流媒體作業,我理解如果我將一個超過兩天的時間戳分配給一個元素,那么將有一個帶有該元素的窗口,如果我使用的示例是將每日表輸出到BigQueryIO.java中描述的BigQuery,該作業將使用實際日期在BigQuery表中寫入過去兩天的元素。

我想將過去的元素寫入BigQuery表,並使用窗口元素的時間戳而不是當前窗口的時間,是否可能?

現在我按照DataflowJavaSDK / sdk / src / main / java / com / google / cloud / dataflow / sdk / io / BigQueryIO.java中描述的示例:

    PCollection<TableRow> quotes = ...
    quotes.apply(Window.<TableRow>info(CalendarWindows.days(1)))
       .apply(BigQueryIO.Write
         .named("Write")
         .withSchema(schema)
         .to(new SerializableFunction<BoundedWindow, String>() {
               public String apply(BoundedWindow window) {
                 String dayString = DateTimeFormat.forPattern("yyyy_MM_dd").parseDateTime(
                   ((DaysWindow) window).getStartDate());
                 return "my-project:output.output_table_" + dayString;
               }
             }));

如果我理解正確,您希望確保根據元素(引號)的固有時間戳創建BigQuery表,而不是管道運行時的掛鍾時間。

TL; DR代碼應該已經做你想要的了 ; 如果不是,請發布更多詳情。

更長的解釋:Dataflow處理的關鍵創新之一是事件時間處理 這意味着Dataflow中的數據處理幾乎完全與處理發生時分離 - 重要的是處理事件發生的時間。 這是在批處理或流數據源上運行完全相同的代碼的關鍵要素(例如,使用處理歷史點擊日志的相同代碼處理實時用戶點擊事件)。 它還可以靈活處理遲到的數據。

請參閱批處理世界 ,“事件時間與處理時間”部分,以了解Dataflow處理模型的這一方面(整篇文章非常值得一讀)。 有關更深入的說明,請參閱VLDB文件 窗口觸發器的官方文檔中,這也以面向用戶的方式進行了描述。

因此, 不存在諸如“當前窗口”之類的東西,因為管道可以同時處理在不同時間發生並且屬於不同窗口的許多不同事件。 事實上,正如VLDB文件指出的那樣,Dataflow管道執行的一個重要部分是“按窗口分組元素”。

在您展示的管道中,我們將使用記錄上提供的時間戳將要寫入BigQuery的記錄分組到窗口中,並將每個窗口寫入其自己的表,如有必要,為新遇到的窗口創建表。 如果后期數據到達窗口(請參閱關於窗口的文檔和觸發器以討論后期數據),我們將附加到已有的表中。

上面提到的代碼對我不起作用了。 Google文檔中有一個更新的示例 ,但DaysWindowIntervalWindow取代,后者對我有用

 PCollection<TableRow> quotes = ...
 quotes.apply(Window.<TableRow>into(CalendarWindows.days(1)))
   .apply(BigQueryIO.Write
     .named("Write")
     .withSchema(schema)
     .to(new SerializableFunction<BoundedWindow, String>() {
       public String apply(BoundedWindow window) {
         // The cast below is safe because CalendarWindows.days(1) produces IntervalWindows.
         String dayString = DateTimeFormat.forPattern("yyyy_MM_dd")
              .withZone(DateTimeZone.UTC)
              .print(((IntervalWindow) window).start());
         return "my-project:output.output_table_" + dayString;
       }
     }));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM