我正在尝试用 Scala 编写一个 Hadoop 映射器类。作为起点,我从“Hadoop:权威指南”一书中获取了一个 Java 示例,并尝试将其移植到 Scala。
原始 Java 类扩展 org.apache.hadoop.mapreduce.Mapper
:
public class MaxTemperatureMapper
extends Mapper<LongWritable, Text, Text, IntWritable>
并覆盖方法
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException
此方法被调用并正常工作(我使用单元测试进行测试,然后使用 yarn 运行它)。
我对 Scala 端口的尝试是:
class MaxTemperatureMapperS extends Mapper[LongWritable, Text, Text, IntWritable]
然后是方法
@throws(classOf[IOException])
@throws(classOf[InterruptedException])
override def map(key: LongWritable, value: Text, context: Context): Unit =
{
...
}
但是 Scala 编译器报错:
error: method map overrides nothing.
所以我认为这两种方法在 Scala 和 Java 中具有相同的签名,但显然我遗漏了一些东西。你能给我一些提示吗?
最佳答案
有时最好的方法是让您的 IDE 为您工作:
class Test extends Mapper[LongWritable, Text, Text, IntWritable] {
override def map(key: LongWritable, value: Text, context: Mapper[LongWritable, Text, Text, IntWritable]#Context): Unit = ???
}
在这种情况下,问题是类 Context 的定义“存在于”类 Mapper
中,因此您需要使用 # 语法
关于java - 从 Java 泛型类继承的 Scala 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692230/