Orc在Hive中并不比CSV更快?

4

我对在生产中使用Hadoop还比较新手。我使用scoop将来自数据库的大型表格导入到Hive中。scoop创建了一个逗号分隔的文本文件,并在Hive中创建了相应的表。

然后我执行了以下语句:create table new_table_orc stored as orc as select * from old_table_csv

由于与ORC(二进制数据,针对大型表的列式数据存储,压缩等)相比,文本文件的效率要低得多,我期望能获得巨大的、数量级上的改进,但是查询执行时间似乎并没有改变!

我在两个版本(文本、ORC甚至是parquet)上都使用了相同的简单查询,并在多个这些表格用于联接时使用了相同的方法。

附加信息: 我正在测试的主要表格大约有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建议的那样,但似乎并没有产生很大的差异(它只减少了几秒钟的时间)。

到底是怎么回事?为什么我看不到数量级的加速?你还需要更多的详细信息吗?


你运行了什么查询?ORC或Parquet更快,但不适用于扫描整个表。 - OneCricketeer
你拥有的大数据量和你运行的查询都是很重要的。如果你测试的数据集很小,你将无法发现任何性能差异。 - sandeep rawat
@sandeeprawat 在描述中增加了更多信息。数据不小,尽管我仍然从单个机器的角度思考。 - Shahbaz
@cricket_007,在我的一个查询中,我正在进行全表扫描,但只针对50列中的1列,这样做应该会大大提高速度。 - Shahbaz
你期望什么级别的数据量?百万行并不能说明数据的大小。Hadoop也不喜欢小文件。任何mapreduce进程的启动都需要几秒钟时间。启用Tez,或者切换到SparkSQL、Impala、Presto、Drill等工具,可以让你的查询在几秒钟内完成运行。 - OneCricketeer
1个回答

2

根据我的经验,ORC更快。对于每个HIVE表使用ORC文件应该极大地有助于获得快速响应时间以回答你的HIVE查询。我认为你需要启用矢量化,矢量化查询执行通过一次性处理1024行而不是每次单行来提高操作(如扫描、聚合、过滤和连接)的性能。

set hive.vectorized.execution.enabled = true;    
set hive.vectorized.execution.reduce.enabled = true;  

有许多方法可以提高Hive的性能,例如Tez执行、基于成本的查询优化(CBO)等。


我在JDBC客户端中执行了您的标志,没有出现错误。然而,性能似乎保持不变。 - Shahbaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接