2016-03-05 151 views
5

我想這斯卡拉表達到Java轉換:轉換斯卡拉表達對Java 1.8

val corpus: RDD[String] = sc.wholeTextFiles("docs/*.md").map(_._2) 

這是我在Java中:

RDD<String> corpus = sc.wholeTextFiles("docs/*.md").map(a -> a._2); 

但我得到a._2錯誤:。

Bad return type in lambda expression: String cannot be converted to R

如果我去了「超級」的方法,這是我所看到的:

package org.apache.spark.api.java.function; 

import java.io.Serializable; 

public interface Function<T1, R> extends Serializable { 
     R call(T1 var1) throws Exception; 
} 

回答

5

在斯卡拉PairRDD是一個元組類型,你可以用_1_2訪問其成員。但是Java沒有內置元組,所以你必須使用方法來獲取這些成員。它應該看起來像這樣,因爲Java總是需要任何函數的括號。

JavaRDD<String> corpus = sc.wholeTextFiles("docs/*.md").map(a -> a._2()); 

編輯:看來,在Scala的一個隱含參數傳遞給map方法,這意味着你必須明確地傳遞在Java中。有關Java Doc的here和有關Scala文檔的here

編輯2:經過幾個小時摸索後發現答案,它必須是JavaRDD。

+0

我得到同樣的錯誤與此... 「字符串不能轉換爲R」 – neuromouse

+0

現在很奇怪,'a'應該是scala.Tuple2 類型。你能檢查你的情況是什麼類型? –

+0

這讓我有同樣的錯誤:(Tuple2 a) - > a._2()。但是,如果我忽略字符串:(Tuple2 a) - > a._2() - 我得到另一個錯誤:無法解析方法映射() – neuromouse

2

你應該能夠使用values()讓您在Java這裏想要的結果:

JavaRDD<String> corpus = sc.wholeTextFiles("docs/*.md").values(); 

注意的是,這裏的類型是JavaRDD不RDD