设置:
我有一个 HBase 表,有 1 亿多行和 100 万多列。每行只有 2 到 5 列的数据。只有 1 个列族。
问题:
我想找出所有不同的 qualifiers
(列)在此 column family
.有快速的方法吗?
我可以考虑扫描整个表,然后得到 familyMap
对于每一行,得到 qualifier
并将其添加到 Set<>
.但这会非常慢,因为有 1 亿多行。
我们能做得更好吗?
最佳答案
您可以为此使用 mapreduce。在这种情况下,您不需要像协处理器那样为 hbase 安装自定义库。 下面是创建 mapreduce 任务的代码。
工作设置
Job job = Job.getInstance(config);
job.setJobName("Distinct columns");
Scan scan = new Scan();
scan.setBatch(500);
scan.addFamily(YOU_COLUMN_FAMILY_NAME);
scan.setFilter(new KeyOnlyFilter()); //scan only key part of KeyValue (raw, column family, column)
scan.setCacheBlocks(false); // don't set to true for MR jobs
TableMapReduceUtil.initTableMapperJob(
YOU_TABLE_NAME,
scan,
OnlyColumnNameMapper.class, // mapper
Text.class, // mapper output key
Text.class, // mapper output value
job);
job.setNumReduceTasks(1);
job.setReducerClass(OnlyColumnNameReducer.class);
job.setReducerClass(OnlyColumnNameReducer.class);
映射器
public class OnlyColumnNameMapper extends TableMapper<Text, Text> {
@Override
protected void map(ImmutableBytesWritable key, Result value, final Context context) throws IOException, InterruptedException {
CellScanner cellScanner = value.cellScanner();
while (cellScanner.advance()) {
Cell cell = cellScanner.current();
byte[] q = Bytes.copy(cell.getQualifierArray(),
cell.getQualifierOffset(),
cell.getQualifierLength());
context.write(new Text(q),new Text());
}
}
reducer
public class OnlyColumnNameReducer extends Reducer<Text, Text, Text, Text> {
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
context.write(new Text(key), new Text());
}
}
关于hadoop - 我们可以从 HBase 表中获取所有列名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225858/