[英]Java Spark unable to process wholeTextFiles
我是Spark API
新手,並且一直在學習。
我在hadoop目錄中有多個文件,正在使用WholeTextFiles讀取這些文件來創建JavaPairRDD<String, String>
。 程序使用Java。
我的要求是處理目錄中文件的列表並實現以下輸出:
文件路徑,單詞
文件路徑,單詞
文件路徑,單詞
...
這基本上是文件的單詞內容,具有相應的文件名(或路徑),配對為<String, String>
。
我嘗試了以下操作,但是不允許將其從tuple2強制轉換為Iterable(在運行時失敗):
JavaSparkContext sc = new JavaSparkContext(new SparkConf()) ;
JavaPairRDD<String, String> files = sc.wholeTextFiles(args[0]);
JavaRDD<Tuple2<String, String>> file_word = files
.flatMap(new FlatMapFunction<Tuple2<String,String>, Tuple2<String,String>>()
{
public Iterable<Tuple2<String, String>> call(Tuple2<String, String> tuple)
{
return (Iterable<Tuple2<String, String>>) new Tuple2<String, Iterable<String>>(tuple._1(), Arrays.asList(((String) tuple._2()).toLowerCase ().split("\\W+")));
}
});
我正在使用Java 8
,帶有Spark 2.2.0
Hadoop2
。
(通過查看此處的其他問題,我可以理解在scala中編寫此代碼更容易,但是我沒有找到有關Java的相關答案)
尋找解決方案。 謝謝。
從我的角度來看,您正在嘗試將Tuple2轉換為Iterable,這無法正常工作。
由於您使用的是Java8,因此可以使用lambda表達式編寫此代碼,這會使事情變得更加緊湊:
JavaPairRDD<String, String> rdd = sc
.wholeTextFiles("path_to_data/*")
.flatMapValues(x -> Arrays.asList(x.split("\\W+")));
請注意,我使用的是flatMapValues
而不是flatMap
因為您只需要處理元組的第二個值。
如果您好奇,可以使用flatmap
將文件中的每個單詞映射到一個元組(fileName,word)來實現:
JavaRDD<Tuple2<String, String>> rdd2 = sc
.wholeTextFiles("path_to_data/*")
.flatMap(x -> Arrays.asList(x._2.split("\\n"))
.stream()
.map(w -> new Tuple2<>(x._1, w))
.iterator());
flatMapValues
只是使您可以用更少的代碼來做到這一點;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.