Hive 基础优化

做数据处理工作,尝尝会用到hive SQL处理数据,这就涉及到了效率问题,一个表跑了两个多小时也是等的让人心醉,耽误工作,于是想着优化一些参数,还有sql代码,查询了一些方法,记录在此,遇见新的方法再更新....下面这些方法都是用过的,确认好用的,提升了工作效率的方法,可放心采用。

1 使用分区剪裁、列剪裁

在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤,比如:
SELECT a.id
FROM lxw1234_a a
left outer join t_lxw1234_partitioned b
ON (a.id = b.url);
WHERE b.day = ‘2015-05-10′
    正确的写法是写在ON后面:
SELECT a.id
FROM lxw1234_a a
left outer join t_lxw1234_partitioned b
ON (a.id = b.url AND b.day = ‘2015-05-10′);
或者直接写成子查询:
SELECT a.id
FROM lxw1234_a a
left outer join (SELECT url FROM t_lxw1234_partitioned WHERE day = ‘2015-05-10′) b
ON (a.id = b.url)

2 少用COUNT DISTINCT

数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换:
SELECT day,
COUNT(DISTINCT id) AS uv
FROM lxw1234
GROUP BY day
可以转换成:
SELECT day,
COUNT(id) AS uv
FROM (SELECT day,id FROM lxw1234 GROUP BY day,id) a
GROUP BY day;

虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的。


参考链接:

1.http://lxw1234.com/archives/2015/06/317.htm

猜你喜欢

转载自blog.csdn.net/pearl8899/article/details/80453299