我编写了一个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在没有降低器的情况下完全运行 - 只有使用映射。