我有一个表,它包含大约10亿条记录。我想更改这些记录的密钥,即获取一个记录以某种方式更改其密钥,删除获取的内容,保存新记录!比如说,我的密钥是[time accountid],我想把它改成[account time],我想用不同的密钥获取实体create new,用[time account]删除实体,用[account time]保存新实体完成这项任务的最佳方法是什么?我正在考虑m/r,但如何删除具有m/r的实体?
62o28rlo1#
您需要一个mapreduce,它将为表的每一行生成一个put和一个delete。这里只需要一个Map器,因为您不需要对数据进行聚合,所以跳过reducer:
TableMapReduceUtil.initTableReducerJob( table, // output table null, // reducer class job);
您的Map程序必须同时生成put和delete,因此要使用的输出值类是突变(https://hbase.apache.org/0.94/apidocs/org/apache/hadoop/hbase/client/mutation.html):
TableMapReduceUtil.initTableMapperJob( table, // input table scan, // Scan instance to control CF and attribute selection MyMapper.class, // mapper class ImmutableBytesWritable.class, // mapper output key Mutation.class, // mapper output value job);
那么您的Map器将如下所示:
Delete delete = ... context.write(oldKey, delete); Put put = ... context.write(newKey, put);
1条答案
按热度按时间62o28rlo1#
您需要一个mapreduce,它将为表的每一行生成一个put和一个delete。这里只需要一个Map器,因为您不需要对数据进行聚合,所以跳过reducer:
您的Map程序必须同时生成put和delete,因此要使用的输出值类是突变(https://hbase.apache.org/0.94/apidocs/org/apache/hadoop/hbase/client/mutation.html):
那么您的Map器将如下所示: