【问题标题】:Unable to fetch data from Hbase based on query parameters无法根据查询参数从 Hbase 获取数据
【发布时间】:2012-08-31 02:17:54
【问题描述】:

如何从 HBase 获取数据?我有一个包含 empId、name、startDate、endDate 和其他列的表。现在我想根据 empId、startDate 和 endDate 从 HBase 表中获取数据。在普通 SQL 中我可以使用:

select * from tableName where empId=val and date>=startDate and date<=endDate

如何在 HBase 中执行此操作,因为它将数据存储为键值对?键是empId。

【问题讨论】:

    标签: hadoop hbase


    【解决方案1】:

    HBase shell 中获取过滤的行很棘手。由于 shell 是 JRuby-based,因此您也可以在这里使用 Ruby 命令:

    import org.apache.hadoop.hbase.filter.CompareFilter
    import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
    import org.apache.hadoop.hbase.filter.BinaryComparator
    import org.apache.hadoop.hbase.filter.FilterList
    import java.text.SimpleDateFormat
    import java.lang.Long
    
    def dateToBytes(val)
      Long.toString(
        SimpleDateFormat.new("yyyy/MM/dd").parse(val).getTime()).to_java_bytes
    end
    
    # table properties
    colfam='c'.to_java_bytes;
    col_name='name';
    col_start='startDate';
    col_end='endDate';
    
    # query params
    q_name='name2';
    q_start='2012/08/14';
    q_end='2012/08/24';
    
    # filters
    f_name=SingleColumnValueFilter.new(
             colfam, col_name.to_java_bytes, 
             CompareFilter::CompareOp::EQUAL, 
             BinaryComparator.new(q_name.to_java_bytes));
    
    f_start=SingleColumnValueFilter.new(
              colfam, col_start.to_java_bytes, 
              CompareFilter::CompareOp::GREATER_OR_EQUAL,
              BinaryComparator.new(dateToBytes(q_start)));
    
    f_end=SingleColumnValueFilter.new(
              colfam, col_end.to_java_bytes, 
              CompareFilter::CompareOp::LESS_OR_EQUAL,
              BinaryComparator.new(dateToBytes(q_end)));
    
    filterlist= FilterList.new([f_name, f_start, f_end]);
    
    # get the result
    scan 'mytable', {"FILTER"=>filterlist}
    

    类似地在Java 中构造一个FilterList

    // Query params
    String nameParam = "name2";
    String startDateParam = "2012/08/14";
    String endDateParam = "2012/08/24";
    
    Filter nameFilter = 
      new SingleColumnValueFilter(colFam, nameQual, CompareOp.EQUAL,
            Bytes.toBytes(nameParam));
    
    //getBytesFromDate(): parses startDateParam and create a byte array out of it
    Filter startDateFilter = 
      new SingleColumnValueFilter(colFam, startDateQual,
            CompareOp.GREATER_OR_EQUAL, getBytesFromDate(startDateParam));
    
    Filter endDateFilter = 
      new SingleColumnValueFilter(colFam, endDateQual,
            CompareOp.LESS_OR_EQUAL, getBytesFromDate(endDateParam));
    
    FilterList filters = new FilterList();
    filters.addFilter(nameFilter);
    filters.addFilter(startDateFilter);
    filters.addFilter(endDateFilter);
    
    HTable htable = new HTable(conf, tableName);
    
    Scan scan = new Scan();
    scan.setFilter(filters);
    ResultScanner rs = htable.getScanner(scan);
    //process your result...
    

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2021-09-14
      相关资源
      最近更新 更多