我有以下(非常简单)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行,所以我认为优化执行可能会有非常小的内存占用并且也更快(因为不需要循环组密钥)。
答案 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." ";?><a href ="<?php echo "http://". $entry[1]; ?>"target="_blank"><?php echo $entry[1];?></a>
<hr />
<?php endforeach; ?>
- 大小写将所有行标记为1或null并且仅计数1。