有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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) 个答案

  1. # 1 楼答案

    reduce函数中的values参数是Iterable,而不是单个值。这是因为通常使用reduce来减少具有相同键的多个值。但在程序中,每个键只有一个值。您可以使用values.next()从这个iterable中获得第一个值。不需要调用next(),只需在Iterable对象本身上调用toString()方法,该方法将打印其类名

    顺便说一句,因为您不需要减少多个值,所以可以将hadoop配置为只使用映射器而不使用减少器运行