2016-03-05 152 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