我有两张table
外部表a
带分格和带扣柱的外桌b
表a有5列(假设c1、c2、c3、c4、c5)
表b有5列(c1、c2、c3、c4,在c5上划分,在c1上划分)。
我运行以下查询
1. select * from A where c5="x" and c1="y"
2. select c1,c2,c3 from A where c5="x" and c1="y"
3. select * from B where c5="x" and c1="y"
4. select c1,c2,c3 from B where c5="x" and c1="y"
所有这些都不使用 MR
但是只有fetch操作符。
问题1: MR
或者fetch—这是否取决于文件的大小或其行为是否始终相同?
问题2:第二和第四个查询的行为与链接相矛盾。这是最近的进步吗?
5. select count(*) from A where c5="x" and c1="y"
6. select count(*) from B where c5="x" and c1="y"
问题3:显然这两种需求 MR
但是5比6快两倍。理想情况下,6应该更快,因为表b是分区和嵌套的,查询是基于这些列的。可能的原因是什么?我多次运行查询。
注意:我使用hdp2.3
1条答案
按热度按时间xsuvu9jc1#
关于q1和q2:
最近,从版本13开始,hive进行了升级,它广泛地使用了hive表stats、列stats,就像那些将表存储为orc(即analysis)特性时一样。这样可以避免执行mr for count(*)查询和all。您可以使用show create table语法检查表的表属性,您可以看到表计数在添加记录等时得到更新。这些值也会记录在配置单元元存储中。
这个,这个,还有这个
问题3:
当我们处理小型数据集时,您提到的mr执行基准可能是正确的。分区和带扣的表对于小数据集的性能可能不会更好,因为它必须经历整个mr阶段,而不像未分区和未带扣的表。
希望我能给你一个关于你的问题的小要点。