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);
使用索引按日志时间查询
select /*+ /*+ INDEX("SO50228751" so_idx) */ * from "SO50228751" where "logtime" between 20180304124511 and 20180304124516;
2条答案
按热度按时间stszievb1#
hbase行按字母顺序排列,因此可以按前缀扫描,但不能按后缀扫描。
您可以做的一件事是根据字段logtime使用rowfilter-write filter逻辑扫描整个表。它将过滤服务器上的行,所以您的客户机代码将只获得正确的行。
8zzbczxx2#
使用过滤器时,完全扫描似乎是不可避免的,除非您知道在给定时间内可能出现的设备ID的大致范围,这可能并不总是可能的。
另一种实现方法是使用中间查找/索引表,将行键的第二部分Map到实际数据表中的第一部分或复合行键。这将使您的主要访问模式保持按设备id查找记录的状态,并且当您希望按第二个键进行查找时,请使用查找表查找数据表中的行键,并使用这些键获取所需的数据。但是,这种方法会让应用程序负责保持查找表同步,以更新/删除数据表。
对于索引的自动管理,您可以尝试phoenix,您可以创建一个phoenix表,其中包含logtime上的全局索引,下面是一些快速示例-
添加数据
创建索引
使用索引按日志时间查询
在决定选择phoenix索引之前,请检查文档和此链接->https://community.hortonworks.com/articles/61705/art-of-phoenix-secondary-indexes.html 了解它们在您的用例中的适合程度。
希望这有帮助。