在对行进行排序时优化Hive GROUP BY

时间:2016-12-20 17:15:48

标签: sql hadoop hive query-optimization hiveql

我有以下(非常简单)Hive查询:

select user_id, event_id, min(time) as start, max(time) as end,
       count(*) as total, count(interaction == 1) as clicks
from events_all
group by user_id, event_id;

该表具有以下结构:

user_id                 event_id                time            interaction 
Ex833Lli36nxTvGTA1Dv    juCUv6EnkVundBHSBzQevw  1430481530295   0
Ex833Lli36nxTvGTA1Dv    juCUv6EnkVundBHSBzQevw  1430481530295   1
n0w4uQhOuXymj5jLaCMQ    G+Oj6J9Q1nI1tuosq2ZM/g  1430512179696   0
n0w4uQhOuXymj5jLaCMQ    G+Oj6J9Q1nI1tuosq2ZM/g  1430512217124   0
n0w4uQhOuXymj5jLaCMQ    mqf38Xd6CAQtuvuKc5NlWQ  1430512179696   1

我知道行首先按user_id排序,然后按event_id排序。

问题是:有没有办法提示"提示"给定行排序后,Hive引擎优化查询?优化的目的是避免将所有组保留在内存中,因为它只需要一次保留一个组。

现在,在具有大约300 GB数据的6节点16 GB Hadoop集群中运行的此查询大约需要30分钟,并使用大部分RAM,从而阻塞系统。我知道每个组都很小,每个(user_id, event_id)元组不超过100行,所以我认为优化执行可能会有非常小的内存占用并且也更快(因为不需要循环组密钥)。

1 个答案:

答案 0 :(得分:1)

创建一个分区排序表。优化器将知道它从元数据中排序。 请参阅此处的示例(官方文档):https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-BucketedSortedTables

仅计算交互= 1:<?php $data = wp_excel_cms_get("top100"); ?> <?php foreach($data as $entry): ?> <? $url = "http://". $entry[1]; $xml = simplexml_load_file('http://data.alexa.com/data?cli=10&dat=snbamz&url='.$url); $rank=isset($xml->SD[1]->POPULARITY)?$xml->SD[1]->POPULARITY->attributes()->TEXT:0; $web=(string)$xml->SD[0]->attributes()->HOST; ?> <?php echo $rank."&nbsp;";?><a href ="<?php echo "http://". $entry[1]; ?>"target="_blank"><?php echo $entry[1];?></a> <hr /> <?php endforeach; ?> - 大小写将所有行标记为1或null并且仅计数1。