2017-09-25 28 views
0

只是想知道如何做限制工作,为下面的简单查询HIVE:'SELECT * from'上的'LIMIT'如何在内部工作?

select * from T limit 100 

试想一下表T有13万条记录

请问上面的查询:
1.第一负荷共13多万元建成的内存&在结果集中只显示100条记录?只有100 &
2.负载给出结果集的100条记录

正在寻找它很长一段时间,现在,大部分的网页只谈使用“限制”,但不涉及如何配置单元用它的下引擎盖。

赞赏有用的回复。

+0

**(1)**运行一个思想实验和验证你的建议(记住,我们是处理分布式系统)**(2)**建议一个技术测试来指示实际的算法。 –

+0

这有什么关系?它最好是随机的,除非你包括一个顺序的子句,在这一点上你知道答案。 – Andrew

+1

“2.仅装载100个”...它会如何加载它们?来自哪里?如果你有1000台机器,每台机器只有1条记录呢?所有机器将运行相同的'SELECT * LIMIT 100'查询 –

回答

1

如果没有施加优化器,蜂房结了扫描整个表。但是蜂房优化 这与释放的HIVE-2925部分hive.fetch.task.conversion,为了缓解 用简单的条件,简单的查询,而不是在所有 运行MR/TEZ。

支持的值是none,minimal和更多。

:禁用hive.fetch.task.conversion(在蜂房0.14.0加入值HIVE-8389)

最小:SELECT *,上分区列FILTER(WHERE和HAVING子句) ,仅限制

:SELECT,FILTER,仅限制(包括TABLESAMPLE,虚拟列)

你的问题更利当最小或更多设置时,会发生什么情况。 它只是通过扫描添加的文件和读取行,直到达到 leastRows()更多是指gitCodeConfighere

+0

,所以你的意思是说它只加载100内存? –

+0

是的,检查在这里https://github.com/apache/hive/blob/release-1.2.1/ql/src/java/org/apache/hadoop/hive/ql/exec/FetchTask.java#L146 – rbyndoor