【问题标题】:Partial Row key scan in HBaseHBase 中的部分行键扫描
【发布时间】:2018-05-08 07:59:27
【问题描述】:

我必须在我的 hbase 部署中遵循行键:

设备编号|记录时间

例如:454312|20180304124511

现在我想进行部分行键扫描,即我只想在 LogTime 范围内进行扫描

例如我想获取logtime t1和t2之间的所有设备号?

请任何人帮忙。

【问题讨论】:

  • 在 Hbase(至少 1.1.x,我使用过)中,您无法有效地扫描行键的后缀部分,因为您进行了完整扫描。让我们考虑重新设计您的架构。

标签: hadoop hbase


【解决方案1】:

HBase 行是按字母顺序排列的,所以可以按前缀扫描,但不能按后缀扫描。

您可以做的一件事是使用 RowFilter 扫描整个表 - 根据您的字段 LogTime 编写过滤器逻辑。它将过滤服务器上的行,因此您的客户端代码将只获得正确的行。

【讨论】:

    【解决方案2】:

    使用过滤器完全扫描似乎是不可避免的,除非您知道设备 ID 的大致范围,这些设备 ID 可以落在给定的持续时间内,这可能并不总是可能的。

    实现此目的的另一种方法是使用中间查找/索引表,将行键的第二部分映射到第一部分或实际数据表中的复合行键。 这将使您的主要访问模式按原样按设备 ID 查找记录,当您想按第二个键查找时,使用查找表在数据表中查找行键并使用这些键来获取所需的数据。 然而,这种方法会让您的应用程序负责保持查找表同步以更新/删除您的数据表。

    对于索引的自动管理,您可以尝试 Phoenix,您可以在 logTime 上创建一个具有全局索引的 Phoenix 表,这里有一些快速示例 -

    CREATE TABLE "SO50228751"(
    "equipNum" integer not null,
    "logtime" bigint not null,
    "f"."data" varchar
    CONSTRAINT pk PRIMARY KEY ("equipNum", "logtime")); 
    

    添加数据

    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124511,'a');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124512,'b');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124513,'c');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124514,'d');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124515,'e');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454313,20180304124521,'f');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454313,20180304124522,'g');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454313,20180304124523,'h');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454313,20180304124524,'i');
    upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124524,'ii');
    

    创建索引

    CREATE INDEX so_idx ON "SO50228751"(logtime);
    

    使用索引按logTime查询

    select /*+ /*+ INDEX("SO50228751" so_idx) */ * from "SO50228751" where "logtime" between 20180304124511 and 20180304124516;
    

    在您决定选择 Phoenix 索引之前,请检查文档和此链接 -> https://community.hortonworks.com/articles/61705/art-of-phoenix-secondary-indexes.html 以了解它们在您的用例中的适用程度。

    希望这会有所帮助。

    【讨论】:

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