![](/img/trans.png)
[英]How to compare two dictionaries with the same keys and update values with a condition in python?
[英]How to compare all the values of two keys with in same PCollection in python?
我是 Apache Beam/數據流的新手。 我正在 Apache Beam 中讀取 BigQuery 表,我想按兩個不同的列進行分組並比較兩個不同鍵的所有值。 我創建了一個由兩個不同列(ID、Date)組成的元組,用作 Key。 以下是表格中的示例數據
ID Date P_id position
"abc" 2019-08-01 "rt56" 5
"abc" 2019-08-01 "rt57" 6
"abc" 2019-08-01 "rt58" 7
"abc" 2019-08-02 "rt56" 2
"abc" 2019-08-02 "rt57" 4
"abc" 2019-08-02 "rt58" 7
現在我想比較 P_ids 對 ("abc", 2019-08-01) 和 ("abc", 2019-08-02) 的位置,看看是否有任何 P_id 位置發生變化,然后在表“狀態”為 True。 所以我的新表應該如下所示
我正在嘗試使用以下代碼
ID Date P_id position Status
"abc" 2019-08-01 "rt56" 5 False (as this is first date)
"abc" 2019-08-01 "rt57" 6
"abc" 2019-08-01 "rt58" 7
"abc" 2019-08-02 "rt56" 2 True
"abc" 2019-08-02 "rt57" 4
"abc" 2019-08-02 "rt58" 7
(
p
| "get_key_tuple" >> beam.ParDo(lambda element: tuple(element["Id"], element["Date]))
| "group_by" >> beam.GroupByKey()
| "compare_and_add_status" >> beam.ParDo(compare_pos)
)
但我不知道我應該如何處理函數 compare_pos()
考慮到我有一個非常大的表格和很多 ID,獲得一些關於如何有效地比較位置並創建一個新列以了解狀態的想法將非常有幫助。
Beam 的 GroupByKey 采用 2 元組的 PCollection 並返回一個 PCollection,其中每個元素都是鍵的 2 元組和與該鍵關聯的所有值的(無序)可迭代對象。 例如,如果您的原始集合具有元素
(k1, v1)
(k1, v2)
(k1, v3)
(k2, v4)
GroupByKey 的結果將是一個帶有類似元素的 PCollection
(k1, [v1, v3, v2])
(k2, [v4])
在您的情況下,您的鍵和值本身就是元組。 因此,您可以使用原始集合並應用Map(lambda elt: ((elt['Id'], elt['Date']), (elt['P_id'], elt['position'])))
會給你一個帶有元素的 PCollection
("abc", 2019-08-01), ("rt56", 5)
("abc", 2019-08-01), ("rt57", 6)
("abc", 2019-08-01), ("rt58", 7)
("abc", 2019-08-02), ("rt56", 2)
("abc", 2019-08-02), ("rt57", 4)
("abc", 2019-08-02), ("rt58", 7)
其中,在應用 GroupByKey 后將成為
("abc", 2019-08-01), [("rt56", 5), ("rt57", 6), ("rt58", 7)]
("abc", 2019-08-02), [("rt56", 2), ("rt57", 4), ("rt58", 7)]
此時,您的compare_pos
函數可以檢查與給定ID, Date
對相對應的所有P_id, position
元組ID, Date
並執行發出需要更改的內容(及其相應的鍵)所需的任何邏輯。
我可能對 OP 的解釋有誤,但如果 @robertwb 的建議不起作用,請嘗試按以下方式分組:
| "Create k, v tuple" >> beam.Map(
lambda elem: ((elem["P_id"], elem["ID"]), [elem["Date"], elem["position"]]))
| "Group by key" >> beam.GroupByKey()
這將輸出以下結構:
(('rt56', 'abc'), [['2019-08-01', 5], ['2019-08-02', 2]])
(('rt57', 'abc'), [['2019-08-01', 6], ['2019-08-02', 4]])
(('rt58', 'abc'), [['2019-08-01', 7], ['2019-08-02', 7]])
這應該允許您單獨比較生成的 PCollection 中的每個元素,而不是在 PCollection 中的元素之間進行交叉比較。 如果我是對的,這應該更適合 Beam 的執行模型。
這是基於我的假設,即您想要檢查給定 P_id 的位置是否在兩個日期之間發生了變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.