簡體   English   中英

Java Spark無法處理WholeTextFiles

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM