2017-05-31 45 views
0

我有一個保存KV並且只有一個鍵值的PCollection,鍵沒有意義,並且該值保存KV的可迭代值。這個內部KV的關鍵是一個數字,這個KV的值是一個字符串的Iterable。 的PCollection的定義是這樣的:數據流按照PCollection的順序寫入文件

PCollection<KV<String, Iterable<KV<Long, Iterable<String>>>>> 

我想寫在一臺機器上的文件:排序由數字,每個數字和在這個數字中,文件一行中的每個字符串。

使用這個PCollection我可以有一個ParDo,在它的processElement方法中接收所有的數字和它們的字符串。 現在我可以按數字排序,迭代數字,每個數字迭代字符串並將字符串和數字輸出到輸出集合。

然而,當我寫這篇文章收集到這樣的文件:

outputCollection.apply(TextIO.Write.withoutSharding().to(options.getOutputFilePath())); 

字符串不寫的數量排序,似乎寫入並行執行,即使它是在本地完成單機。 儘管我將「number:string」插入按照數字排序的輸出集合中,但在文件中我看到了混合的數字。

如何控制TextIO.Write寫入記錄的順序?我可以告訴它在單個線程中運行並使用元素插入到PCollection的順序嗎?

謝謝

+0

[從谷歌雲數據流輸出排序的文本文件(https://stackoverflow.com/questions/39110258/output-sorted-text-file-from-google-cloud-dataflow)的可能的複製 –

+0

同樣在這裏看到(閱讀,但同樣的問題) - > https://stackoverflow.com/questions/42027780/read-file-in-order-in-google-cloud-dataflow –

回答

1

PCollection中的元素是無序的。這與PCollection中的所有元素可能在不同機器上處理的事實密切相關,並且機器之間的排序很困難。

如果您知道特定密鑰的所有數據都適合一臺機器,則可以輸出包含所有值的單個元素,然後創建將其寫入文件的自定義接收器。

相關問題