我对在生产中使用 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 列。
我正在运行几个查询:
从 my_table 中选择总和(col1);
<= 40 秒
从 my_table_orc 中选择总和(col1);
<= 31 秒
和
从 my_table 中选择不同的 col2,其中 col3 = someval;
<= 53 秒
从 my_table_orc 中选择不同的 col2,其中 col3 = someval;
<= 35 秒
我还启用了矢量化,正如@sahil desai 所建议的那样,但似乎确实产生了巨大的不同(它确实减少了几秒钟的时间)。
这是怎么回事,为什么我没有看到数量级的加速?您还需要什么详细信息?
最佳答案
根据我的经验,ORC 更快。为每个 HIVE 表使用 ORC 文件应该非常有利于获得对 HIVE 查询的快速响应时间。我认为您必须启用矢量化,矢量化查询执行可以提高扫描、聚合、过滤和连接等操作的性能,方法是一次批量执行 1024 行,而不是每次执行一行。
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
有很多方法可以提高 Hive 性能,例如 Tez 执行、基于成本的查询优化 (CBO) 等。
关于hadoop - Orc 不比 Hive 中的 csv 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47423435/