我在制作中使用Hadoop相当新。我用scoop将数据库中的大表引入Hive。 Scoop创建了一个逗号分隔的文本文件,并在Hive中创建了相应的表。
然后我执行了create table new_table_orc stored as orc as select * from old_table_csv
由于文本文件与ORC(二进制数据,胖表的列式数据存储,压缩等)相比效率低,我预计会有一个巨大的,数量级的改进但查询执行时间似乎根本没有变化!
我在两个版本(文本,ORC甚至是镶木地板)上都使用了相同的简单查询,并且当在连接中使用了其中几个表时,它们也做了同样的精简。
其他信息: 我测试的主表有大约4.3亿行和大约50列。
我正在运行几个查询:
select sum(col1) from my_table;
< = 40秒
select sum(col1) from my_table_orc;
< = 31秒
和
select distinct col2 from my_table where col3 = someval;
< = 53秒
select distinct col2 from my_table_orc where col3 = someval;
< = 35秒
我也启用了矢量化,正如@sahil desai建议的那样,但似乎确实产生了巨大的差异(它确实将时间减少了几秒钟)。
这里发生了什么,为什么我没有看到数量级的加速?您需要更多细节吗?
答案 0 :(得分:2)
根据我的经验,ORC更快。对每个HIVE表使用ORC文件应该非常有利于获得HIVE查询的快速响应时间。我认为你必须启用矢量化,矢量化查询执行可以提高扫描,聚合,过滤器和连接等操作的性能,通过一次1024行而不是单行执行它们。
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
有许多方法可以改善蜂巢性能,如Tez执行,基于成本的查询优化(CBO)等。