【发布时间】:2018-05-05 12:38:46
【问题描述】:
我对在生产环境中使用 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;
select sum(col1) from my_table_orc;
和
select distinct col2 from my_table where col3 = someval;
select distinct col2 from my_table_orc where col3 = someval;
我还启用了矢量化,正如 @sahil desai 建议的那样,但似乎确实产生了巨大的不同(它确实减少了几秒钟的时间)。
这里发生了什么,为什么我没有看到数量级的加速?您还需要什么详细信息?
【问题讨论】:
-
您运行了什么查询? ORC 或 Parquet 更快,但不适用于扫描整个表
-
您拥有多大的数据以及您正在运行的查询是什么问题。如果您正在测试小数据集,您将无法找到任何性能差异。
-
@sandeeprawat 在描述中添加了更多信息。数据不小,虽然我还是站在单机的角度思考。
-
@cricket_007 在其中一个查询中我正在进行全面扫描,但仅针对 50 列中的 1 列,仅此一项,就应该给我一个巨大的加速。
-
您期望的数量级是多少?数百万行没有说明数据的大小。 Hadoop 也不喜欢小文件。任何 mapreduce 进程的启动只需几秒钟。启用 Tez,或切换到 SparkSQL、Impala、Presto、Drill 等,让您的查询在几秒钟内运行。