2016-08-30 48 views
1

我想知道是否有方法可以使用Google數據流找出文件中沒有行的總數。任何代碼示例和指針都將非常有幫助。基本上,我有一個方法爲如何使用Google數據流統計文件中的行總數

int getCount(String fileName) {} 

所以,上面的方法將返回行的總數,其實現將數據流代碼。

感謝

+0

你能弄清楚到底有多大的文件,爲什麼要使用數據流爲這個而不是一個直接讀取文件並逐行計數行的Java程序?除非該文件的大小至少爲幾GB,並且除非該文件已存儲在Google Cloud Storage上,否則Dataflow很可能不是該工作的最佳工具。 – jkff

+0

感謝您的關注。是的文件基本上是GB的大小的gz文件。此外,文件位於GCS存儲區。除了數據流之外,您是否還有其他方式想法或者有示例代碼,供我查看。我能夠使用PCollection(String)中的數據流從GCS桶中讀取文件,並在其上應用Count.Globally,但這又給了我PCollection(Long),所以無法從我的方法返回單個long值。謝謝。 – Programmer

+0

也許這有幫助嗎? https://cloud.google.com/dataflow/model/combine – chchrist

回答

2

好像你的使用情況是一個不需要分佈式處理,因爲該文件被壓縮,因此不能並行讀取。但是,爲了便於訪問GCS和自動解壓縮,您仍然可能會發現使用Dataflow API很有用。

由於您還想將結果作爲實際的Java對象從流水線中取出,因此您需要使用運行進程中的Direct runner,而無需與Dataflow服務通信或進行任何分佈式處理,但是回到它提供提取PCollection的成Java對象的能力:

事情是這樣的:

PipelineOptions options = ...; 
DirectPipelineRunner runner = DirectPipelineRunner.fromOptions(options); 
Pipeline p = Pipeline.create(options); 
PCollection<Long> countPC = 
    p.apply(TextIO.Read.from("gs://...")) 
    .apply(Count.<String>globally()); 
DirectPipelineRunner.EvaluationResults results = runner.run(p); 
long count = results.getPCollection(countPC).get(0); 
相關問題