我必须在hbase部署中遵循行键:
EquipmentNumber | LOGTIME
例如:454312 | 20180304124511
现在我想进行部分行键扫描,即我只想在LogTime范围内进行扫描
例如,我想获取logtime t1和t2之间的所有设备号?
任何人都可以帮忙。
答案 0 :(得分:0)
HBase行按字母顺序排序,因此您可以按前缀扫描,但不能通过后缀进行扫描。
您可以做的一件事是使用RowFilter扫描整个表 - 根据您的字段LogTime编写过滤器逻辑。它将过滤服务器上的行,因此您的客户端代码将只获得正确的行。
答案 1 :(得分:0)
使用过滤器完全扫描似乎是不可避免的,除非您知道设备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了解它们在您的用例中的适用程度。
希望这有帮助。