使用MapReduce程序将值发送到HBase表的错误



我编写了一个MapReduce程序,我需要从特定列家族中读取HBase表的数据。

例如,HBase表中的数据看起来像:

Row    Column+Cell
1        column=Name:FName, timestamp=...,value=ABC
1        column=Name:LName, timestamp=...,value=XYZ

现在,我需要将fname和lname附加到另一列族下的fullname中。在地图中,我正在提取数据并将其附加并发送给还原器。

在还原器中,我只是得到钥匙,值对并尝试将fullname添加到表中。

我的还原器实现如下:

public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  Put put = new Put(Bytes.toBytes(key.toString()));
  put.add(Bytes.toBytes("Name"), Bytes.toBytes("FullName"), Bytes.toBytes(values.toString()));
  context.write(null, put);
}

当我在HBase表中检查Fullname时,值不是" Abcxyz",而是将值作为org.apache.hadoop.mapreduce.task.ReduceContextImpl$ValueIterable

请让我知道如何解决此问题。

values redus函数中的参数是迭代的,而不是一个值。这是因为通常减少降低具有相同密钥的多个值。但是在您的程序中,每个密钥只有一个值。您可以使用values.next()从此峰值中获得第一个值。无需拨打next(),您只需在Iterable对象本身上调用toString()方法即可打印其类名称。

顺便说一句,因为您不需要降低 多个值,所以您可以配置hadoop在没有降低器的情况下完全运行 - 只有使用映射。

最新更新