将Scala表达式转换为Java 1.8

5

我正在尝试将这个Scala表达式转换为Java:

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

这是我在Java中的代码:

这是我在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

如果我查看“super”方法,我会看到以下内容:

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

import java.io.Serializable;

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

5
在Scala中,PairRDD是元组类型,您可以使用_1_2访问其成员。但是Java没有内置的元组,因此您必须使用方法来获取这些成员。它应该像这样,因为Java始终需要在任何函数上使用括号。
JavaRDD<String> corpus = sc.wholeTextFiles("docs/*.md").map(a -> a._2());

编辑:在Scala中,map方法会传递一个隐式参数,这意味着在Java中必须显式传递它。请参见此处获取Java文档,此处获取Scala文档。
编辑2:经过几个小时的摸索,找到了答案,它必须是JavaRDD。

我使用这个代码也遇到了同样的错误:“无法将字符串转换为R”。 - neuromouse
现在很奇怪,a应该是类型为scala.Tuple2<String,String>。你能检查一下在你的情况下a是什么类型吗? - Luka Jacobowitz
这个代码让我得到了相同的错误:(Tuple2<String, String> a) -> a._2()。但是如果我省略字符串:(Tuple2 a) -> a._2() - 我会得到另一个错误:无法解析方法map(<lambda expression>)。 - neuromouse
嗯,这很奇怪。我会尝试调查一下。 - Luka Jacobowitz
也许这是一个更相关的错误:'org.apache.spark.api.java.AbstractJavaRDDLike'中的'map(org.apache.spark.api.java.function.Function<scala.Tuple2<java.lang.String,java.lang.String>,java.lang.Object>)'无法应用于'(<lambda表达式>,scala.reflect.ClassTag<java.lang.Object>)'。 - neuromouse
你能试着这样调用它吗:sc.wholeTextFiles("docs/*.md").<String>map(a -> a._2()) - Luka Jacobowitz

2

在Java中,您可以使用values()来获取所需的结果:

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

请注意这里的类型是JavaRDD而不是RDD。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接