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

标签 hadoop hbase

设置:

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

相关文章:

hadoop - 压缩MapReduce的输出文件,而不合并它们

hadoop - 如何更新 HDFS 中的文件

mysql - 使用sqoop从Mysql导入数据到Hbase时出错

performance - 平衡 HDFS -> HBase mapreduce 作业的想法

hadoop - 如何摆脱 Flume 拦截器中的 NullPointerException?

python - 使用 Scala 或 Python 列出存储在 Hadoop HDFS 上的 Spark 集群中可用的所有文件?

hadoop - Hadoop -copyFromLocal无法找到目标

hadoop - 连接被拒绝 - 为什么 zookeeper 尝试连接到本地主机而不是服务器 ip

hadoop - 你能知道有多少输入值在 Hadoop 中有 reducer 而无需迭代它们吗?

java - 无法从 MapReduce 代码访问 HBase