使用MapReduce程序将值发送到HBase表时发生java错误
我已经编写了一个mapreduce程序,需要从特定列族的HBase表中读取数据
例如,HBase表中的数据如下所示:
Row Column+Cell
1 column=Name:FName, timestamp=...,value=ABC
1 column=Name:LName, timestamp=...,value=XYZ
现在,我需要将FName和LName作为全名附加到同一列族下的另一列中。在map中,我提取数据并附加它,然后发送到reducer
在Reducer中,我只是获取键、值对,并尝试将全名添加到表中
我的reducer实现如下所示:
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
得到的值
请让我知道如何解决这个问题
# 1 楼答案
reduce函数中的
values
参数是Iterable,而不是单个值。这是因为通常使用reduce来减少具有相同键的多个值。但在程序中,每个键只有一个值。您可以使用values.next()
从这个iterable中获得第一个值。不需要调用next()
,只需在Iterable对象本身上调用toString()
方法,该方法将打印其类名顺便说一句,因为您不需要减少多个值,所以可以将hadoop配置为只使用映射器而不使用减少器运行