我在 Hbase 中有一个表,比如说“tbl”,我想使用它来查询它
蜂巢。因此我将一个表映射到 hive,如下所示:
CREATE EXTERNAL TABLE tbl(id string, data map<string,string>)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,data:")
TBLPROPERTIES("hbase.table.name" = "tbl");
查询如:
select * from tbl", "select id from tbl", "select id, data
from tbl
真的很快。
但像这样的查询
select id from tbl where substr(id, 0, 5) = "12345"
select id from tbl where data["777"] IS NOT NULL
非常慢。
相反,当从 Hbase shell 运行时:
"scan 'tbl', {
COLUMNS=>'data', STARTROW='12345', ENDROW='12346'}" or
"scan 'tbl', { COLUMNS=>'data', "FILTER" =>
FilterList.new([qualifierFilter('777')])}"
快如闪电!
当我在 jobtracker 上查看 hive 生成的 mapred 作业时,我
发现“map.input.records”计算了Hbase表中的所有项目,
这意味着该作业在启动任何映射器之前都会进行全表扫描!
此外,我怀疑它将所有数据从 Hbase 表复制到 hdfs 以
执行前映射器 tmp 输入文件夹。
所以,我的问题是 - 为什么 hive 的 hbase 存储处理程序无法翻译
hive 查询适当的 hbase 函数?为什么它扫描所有记录
然后使用“where”子句对它们进行切片?如何改进?
任何提高 Hive 查询性能的建议(映射到 HBase 表)。
我们可以在HBase表上创建二级索引吗?
我们正在使用 HBase 和 Hive 集成并尝试调整 Hive 查询的性能。