我目前正在使用Impala查询Hbase中的数据并加入另一个Impala HDFS表。查询非常慢。查询是这样的:
SELECT * FROM impala_hdfs_table a
JOIN impala_hbase_table b
ON a.index = b.index
where a.month =9;
index
是Hbase表中的行键。我希望这个查询将直接访问HBase中的特定行(因为我提供了行键),并将结果与impala_hdfs_table
结合起来。但是impala在Hbase中用完全扫描解释了这个计划:
Estimated Per-Host Requirements: Memory=1.00GB VCores=2
05:EXCHANGE [UNPARTITIONED]
|
02:HASH JOIN [INNER JOIN, PARTITIONED]
| hash predicates: b.index = a.index
|
|--04:EXCHANGE [HASH(a.index)]
| |
| 00:SCAN HDFS [inspex.impala_hdfs_table a]
| partitions=1/13 files=1 size=11.63MB
|
03:EXCHANGE [HASH(b.index)]
|
01:SCAN HBASE [inspex.impala_hbase_table b]
所以现在查询运行速度很慢。我的问题是: Impala如何将Impala查询转换为HBase?有没有办法运行这样的查询,以便我们可以避免在Hbase中完全扫描?谢谢。
PS:我将HDFS和Hbase结合起来的原因是,我们的用例需要对几个列进行一些UPDATE操作,所以我将它们分开并在HBase中创建一个帮助表来维护这部分数据。 Impala中映射到hbase中的行键的列是String。两个表中的index
都是字符串。我这样做的原因是Hbase rowkey必须映射到String列(参见here)。否则将进行全面扫描。