分割
![]() |
將集合中的元素分成多個輸出集合。分割函式包含邏輯,該邏輯決定如何將輸入集合的元素分成每個產生的分割輸出集合。
分割的數量必須在圖表建構時決定。您無法在管線中途決定分割的數量
請參閱 Beam 程式設計指南 中的更多資訊。
範例
在下列範例中,我們建立一個具有 PCollection
的管線,其中包含農產品及其圖示、名稱和持續時間。然後,我們以多種方式應用 Partition
,將 PCollection
分割成多個 PCollection
。
Partition
接受一個函式,該函式接收分割的數量,並傳回元素所需分割的索引。傳遞的分割數量必須是正整數,並且必須傳回介於 0
到 num_partitions-1
之間的整數。
範例 1:使用函式分割
在下列範例中,我們有一個已知的持續時間清單。我們將 PCollection
分割成每個持續時間類型的一個 PCollection
。
範例 2:使用 lambda 函式分割
我們也可以使用 lambda 函式來簡化範例 1。
範例 3:使用多個引數分割
您可以將具有多個引數的函式傳遞給 Partition
。它們會作為額外的位置引數或關鍵字引數傳遞給該函式。
在機器學習中,將資料分割成訓練和測試資料集是一項常見的工作。通常,80% 的資料用於訓練模型,20% 用於測試。
在此範例中,我們將 PCollection
資料集分割成訓練和測試資料集。我們定義了 split_dataset
,它採用 plant
元素、num_partitions
和一個額外的引數 ratio
。ratio
是一個數字列表,表示每個分割將包含多少項目的比例。num_partitions
由 Partitions
用作位置引數,而 plant
和 ratio
會傳遞給 split_dataset
。
如果我們想要 80%/20% 的分割,我們可以指定比例 [8, 2]
,這表示每 10 個元素中,有 8 個進入第一個分割,2 個進入第二個分割。為了決定將每個元素傳送到哪個分割,我們有不同的儲存桶。在我們的例子中,[8, 2]
有 10 個儲存桶,其中前 8 個儲存桶代表第一個分割,最後 2 個儲存桶代表第二個分割。
首先,我們檢查比例清單的長度是否對應於我們傳遞的 num_partitions
。然後,我們取得每個元素的儲存桶索引,範圍從 0 到 9 (num_buckets-1
)。我們可以執行 hash(element) % len(ratio)
,但我們改為對 JSON 表示法的所有 ASCII 字元求和,以使其具有確定性。最後,我們迴圈處理比例中的所有元素,並有一個執行中的總計,以識別該儲存桶對應的分割索引。
這個 split_dataset
函式具有足夠的通用性,可以支援任何比例的任意分割數量。您可能想要調整儲存桶指派,以便為您的資料集使用更合適或隨機化的雜湊。
相關轉換
- 如果函式只是決定是否輸出元素,則 篩選 非常有用。
- ParDo 是最通用的逐元素對應操作,並且包含其他功能,例如多個輸出集合和側輸入。
- CoGroupByKey 執行每個鍵的等值聯結。
![]() |
上次更新於 2024/10/31
您是否找到您要尋找的所有內容?
它是否實用且清楚?您有任何想要變更的地方嗎?請告訴我們!