3

我在 Scala 中为 Hbase 编写 mapreduce 作业时遇到了这个奇怪的问题。问题是我的 scala 类可以说 ScalaMapReducer 必须扩展以下类 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapper.html

但是当我这样做并“覆盖” map 方法(继承自 TableMapper 的超类 Mapper 形式)时,scala 会抱怨错误“map 不会覆盖任何内容”并且无法编译,而我可以在 Java 中毫无问题地这样做。

我找到了以下解决方法:

1) 定义一个 Dummy Java 类,它扩展了 TableMapper 类并用一些空实现覆盖地图。现在从 scala 扩展这个 Dummy 类。

2)我在 定义 Mappers 特征的goole解决方法中找到了这个。

虽然我猜这可能与内部课程有关,但我真的没有更多的线索和解释。

这是一个通用的 Scala 问题

编辑:来自我的 scala 类的示例代码,

class ScalaMapReducer extends TableMapper[Text,IntWritable]
{
    override def map(row:ImmutableBytesWritable,result:Result,context:Context):Unit  =
    {
        //..some code
    }
}
4

2 回答 2

4

根据提供的信息(即没有代码!) ,您犯的最可能的错误(并且您已经犯了一个)是错误使用类型参数之一。例如,如果接口定义了一个方法:

public interface I<T> { public void doStuff(T t); }

也许您可能已经实现如下:

class I0 extends I[String] { override def doStuff[String](String s) }
                                               // ^^^^^^  ^^^^^^
                                               // oops, a type parameter

虽然我不能确定,因为你没有向我们展示代码。如果您使用的是 IDE,为什么不让它填写一个空白的实现呢?(使用IDEA,这是CTRL-i

于 2012-05-29T20:23:16.920 回答
4

错误映射不会覆盖任何内容几乎总是因为映射中的键、值类型和归约定义不匹配。仔细检查一下,一些示例代码可能有助于更好地调试。

于 2012-05-29T18:40:50.937 回答