【问题标题】:How to do HBase partial Scan?如何进行 HBase 部分扫描?
【发布时间】:2016-11-06 05:34:49
【问题描述】:

我的 HBase 表包含大约 1000 万条记录。 我有三个关于 HBase 的问题

  1. 扫描 1000 万条记录可能需要多长时间?
  2. 我应该选择 HIVE HBase 集成吗?
  3. 如果我在每一行中只为一个标识符(如 FL01)添加前缀,如何执行部分范围扫描?

4294970043|1
列=cf:SegmentMultipleFundbDescription,时间戳=1478316937790, 值= 4294970043|1
列=cf:SegmentMultipleFundbDescription_languageId, 时间戳=1478316937790,值=505074 4294970043|1
列=cf:StatementTypeCode,时间戳=1478316937790,值=FTN 4294970929|1 列=cf:FFAction, 时间戳=1478316937790,值=I 4294970929|1
列=cf:文件名,时间戳=1478316937790, value=Fundamental.FinancialLineItem.FinancialLineItem.ThirdPartyPrivate.FTN.1.2 016-07-15-2108.Full 4294970929|1 列=cf:FilePartition, 时间戳=1478316937790,值=ThirdPartyPrivate 4294970929|1
列=cf:文件分区位置,时间戳=1478316937790,值=FTN 4294970929|1
列=cf:FinancialConceptCodeGlobalSecondary, 时间戳=1478316937790,值= 4294970929|1
列=cf:FinancialConceptCodeGlobalSecondaryId, 时间戳=1478316937790,值= 4294970929|1
列=cf:FinancialConceptGlobal,时间戳=1478316937790,值=METL 4294970929|1
列=cf:FinancialConceptGlobalId,时间戳=1478316937790, 值=3015071

【问题讨论】:

    标签: hadoop hive hbase


    【解决方案1】:

    HBASE 将执行 FTS,除非您提供开始和停止行键。因此,如果标识符是行键的一部分并且您的行键是固定的,那么您可以尝试设置开始和停止行键,否则尝试模糊过滤器。否则,如果标识符不是行键 HBASE 的一部分,则会执行 FTS。

    扫描所需的时间实际上取决于各种因素,例如行键的大小、多少 CF、多少列限定符...

    【讨论】:

      【解决方案2】:

      假设您的键是字符串并且行作为映射返回列表中,那么您的范围扫描应该类似于下面的代码。

      public List<Map<String,byte[]>> rangeFetch(String valueFrom, String valueTo, String[] columns, int maxrows) {
          ArrayList<Map<String,byte[]>> rst = new ArrayList<Map<String,byte[]>>();
          Scan scn = new Scan();
          scn.setStartRow(valueFrom.getBytes());
          scn.setStopRow (valueTo.getBytes());
          for (String colName : columns) {
              scn.addColumn(colName.getBytes());
          }
          ResultScanner rsc = null;
          int rowCount = 0;
          try {
              rsc = oTbl.getScanner(scn);
              for (Result res=rsc.next(); res!=null && rowCount<maxrows; res=rsc.next()) {
                  Map<String,byte[]> row = new HashMap<String,byte[]>();
                  for (String colName : columns) {
                      KeyValue kvl = res.getColumnLatest("columnFamilyName".getBytes(), colName.getBytes());
                      if (kvl!=null) {
                          if (kvl.getValue()!=null)
                              row.put(colName, kvl.getValue());
                      }
                  } // next
                  rst.add(row);             
              } // next
          } finally {
              if (rsc!=null) rsc.close();
          }
          return rst;
      }
      

      然后用

      调用它
      List<Map<String,byte[]>> results = yourObj.rangeFetch("FL01"+"000000", "FL01"+"999999", new String[]{"column1","column2","column3"}, 10000);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多