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


0

设置:

我有一个HBase表,有100多万行和100多万列。每行只有2到5列的数据。只有一栏的家庭。

问题:

我想找出这个列族中所有不同的限定符(列)。有没有快速的方法?

我可以考虑扫描整个表,然后为每行获取familyMap,获取限定符并将其添加到集合中。但这将是非常缓慢的,因为有100多米的行。

我们能做得更好吗?

3 答案


0

您可以使用mapreduce进行此操作。在本例中,您不需要像在协处理器中那样为hbase安装自定义libs。

job设置

    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());  

   }

}

}

减速机

public class OnlyColumnNameReducer extends Reducer<Text, Text, Text, Text> {

@Override
protected void reduce(Text key, Iterable&lt;Text&gt; values, Context context) throws IOException, InterruptedException {    
        context.write(new Text(key), new Text());    
}

}


0

HBase可以可视化为分布式NavigableMap>>

对于所有区域服务器中可用的所有限定符的列表,没有“元数据”(例如集中存储在主节点中的内容)。

因此,如果您有一个一次性用例,唯一的方法就是扫描整个表,并在集合中添加限定符名,就像您提到的那样。

如果这是一个重复的用例(再加上如果您有权将组件添加到您的技术堆栈中),您可能需要考虑添加Redis。可以使用Redis集以分布式方式维护一组限定符。


0

HBase协处理器可用于此场景。您可以编写自定义端点实现,其 job 方式与RDBMS中的存储过程类似。它在服务器端执行您的代码,并为每个区域获得不同的列。在 client上,您可以跨所有区域获得不同的列。

性能优势:不会将所有列传输到 client,从而减少网络调用。


我来回答

写文章

提问题

面试题