Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 我们可以从HBase表中获取所有列名吗? 设置:_Hadoop_Hbase - Fatal编程技术网

Hadoop 我们可以从HBase表中获取所有列名吗? 设置:

Hadoop 我们可以从HBase表中获取所有列名吗? 设置:,hadoop,hbase,Hadoop,Hbase,我有一个HBase表,有100多万行和100多万列。每行只有2到5列的数据。只有一个列族中有一个 问题: 我想找出此列系列中所有不同的限定符(列)。有没有快速的方法 我可以考虑扫描整个表,然后为每行获取familyMap,获取qualifier并将其添加到集合中。但这将是非常缓慢的,因为有100多亿行 我们能做得更好吗?HBase可以可视化为一个分布式的NavigableMap 关于所有区域服务器中可用的所有限定符列表,没有“元数据”(例如集中存储在主节点中的内容) 因此,如果您有一个一次性用例

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

问题: 我想找出此
列系列
中所有不同的
限定符
(列)。有没有快速的方法

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


我们能做得更好吗?

HBase可以可视化为一个分布式的
NavigableMap

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

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


如果这是一个重复使用的案例(加上,如果你有权将组件添加到你的技术栈),你可能想考虑添加ReIIS。一组限定符可以使用

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


性能优势:所有列都不会传输到客户端,这会减少网络调用。

您可以使用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());  

       }
 }
仅公共类ColumnNameMapper扩展了TableMapper{
@凌驾
受保护的void映射(ImmutableBytesWritable键、结果值、最终上下文)引发IOException、InterruptedException{
CellScanner CellScanner=value.CellScanner();
while(cellScanner.advance()){
Cell Cell=cellScanner.current();
byte[]q=Bytes.copy(cell.getQualifierArray(),
cell.getQualifierOffset(),
cell.getQualifierLength());
write(新文本(q),新文本());
}
}
}

减速器

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());    
    }
}
仅公共类ColumnNameReducer扩展了Reducer{
@凌驾
受保护的void reduce(文本键、Iterable值、上下文上下文)引发IOException、InterruptedException{
write(新文本(键),新文本());
}
}