gpt4 book ai didi

hadoop - 我们可以从 HBase 表中获取所有列名吗?

转载 作者:可可西里 更新时间:2023-11-01 14:19:34 25 4
gpt4 key购买 nike

设置:

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com