簡體   English   中英

如何在 Apache Beam / Cloud Dataflow 中實現回顧

[英]How to implement a lookback in Apache Beam / Cloud Dataflow

我正在使用 Python 實現基於 Apache Beam 的 ETL 管道,在 Google Cloud Dataflow 上運行。 這個過程本身很簡單:

1. Read data from BigQuery using BigQuerySource
2. Transform data
    2.1. Performing basic transforms on row level
    2.2. Calculate various parameters based on historical data
3. Write data into another BigQuery table using BigQuerySink

問題是2.2。 - 為了計算參數,我不僅需要當前行,還需要同一張表中的X(通常為 100-500)行。

當然,我可以只運行另一個查詢來加載數據,但這會非常低效。 實現這一點的最有效和最簡單的方法是什么?

我的第一個問題是:為什么不在 BigQuery 中執行此操作? 我不是 BQ 專家,但我認為 window 函數或 LAG function 將允許您說:“對於每個結果,給我之前的 N 個結果”。

Beam 沒有任何開箱即用的“先前 N 條記錄”的概念。 根據設計,PCollection 元素沒有任何相鄰記錄的上下文。 但是,您可能可以為此使用 GroupByKey function。

  1. 將每一行復制到可能與此相關的所有元素的鍵/值對中
  2. 使用 GroupByKey 進行分組

例如,如果您的表格如下所示:

my_key | my_value
1      | "Goodbye Earl"
2      | "Cowboy Take Me Away"
3      | "Sin Wagon"
4      | "Traveling Soldier"

假設每一行都需要前2行。在這種情況下,第2行和第3行最終將需要第1行。第3行和第4行需要第2行; 等創建一個 DoFn class ,它為每個元素輸出所有這些元素。

[
    (1, "Goodbye Earl"),
    (2, "Goodbye Earl"),
    (3, "Goodbye Earl")
]

[
    (2, "Cowboy Take Me Away"),
    (3, "Cowboy Take Me Away"),
    (4, "Cowboy Take Me Away")
]

對於第 2 行,GroupByKey 將為您提供可以聚合的元素列表。

["Goodbye Earl", "Cowboy Take Me Away"]

您很可能希望將 BigQuery 行解析為數據 class。 這樣您就可以識別哪些是原創的,哪些是復制品。

暫無
暫無

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

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