我们可以从hbase表中获取所有列名吗?

velaa5lx  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(1112)

设置:

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

问题:

我想找出所有不同的 qualifiers (列)在此 column family . 有没有快速的方法?
我可以考虑扫描整张table,然后 familyMap 对于每一行,获取 qualifier 并将其添加到 Set<> . 但这将是非常缓慢的,因为有100多米的行。
我们能做得更好吗?

zazmityj

zazmityj1#

hbase协处理器可用于此场景。您可以编写自定义端点实现,其工作方式与rdbms中的存储过程类似。它在服务器端执行您的代码,并为每个区域获得不同的列。在客户端上,您可以跨所有区域获得不同的列。
性能优势:不会将所有列传输到客户端,从而减少网络调用。

7uzetpgm

7uzetpgm2#

您可以使用mapreduce进行此操作。在本例中,您不需要像在协处理器中那样为hbase安装自定义libs。下面是创建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());  

       }
 }

}
减速机

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

vbkedwbf3#

hbase可以可视化为一个分布式的 NavigableMap<byte[], NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>>> 对于所有区域服务器中可用的所有限定符的列表,没有“元数据”(例如集中存储在主节点中的内容)。
因此,如果您有一个一次性用例,唯一的方法就是扫描整个表,并将限定符名称添加到 Set<> ,就像你提到的。
如果这是一个重复的用例(再加上如果您有权将组件添加到您的技术堆栈中),您可能需要考虑添加redis。可以使用redis集以分布式方式维护一组限定符。

相关问题