Hive语句:Join应该把大表放到最后左连接时,左表中出现的JOIN字段都保留,右表没有连接上的都为空。对于带WHERE条件的JOIN语句,例如:1SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)2WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'执行顺序是,首先完成2表JOIN,然后再通过WHERE条件进行过滤,这样在JOIN过程中可能会输出大量结果,再对这些结果进行过滤,比较耗时。可以进行优化,将WHERE条件放在ON后,例如:1SELECT a.val, b.val FROM a LEFT OUTER JOIN b2ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07')这个JOIN语句,会生成一个MR Job,在选择JOIN顺序的时候,数据量相比应该是b < c,表a和b基于a.key = b.key1进行连接,得到的结果(基于a和b进行连接的Key)会在Reducer上缓存在buffer中,在与c进行连接时,从buffer中读取Key(a.key=b.key1)来与表c的c.key进行连接。另外,也可以通过给出一些Hint信息来启发JOIN操作,这指定了将哪个表作为大表,从而得到优化。例如:1SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)上述JOIN语句中,a表被视为大表,则首先会对表b和c进行JOIN,然后再将得到的结果与表a进行JOIN。
hive优化
group by 数据倾斜
join数据倾斜
多个job并行(union all)
减少job个数
python代码
#!/bin/bash
import sys;if __name__=='__main__':
for line in sys.stdin: m=line.strip().split('\t') print m[0],'\t','huaxue','\t',m[1] print m[0],'\t','shuxue','\t',m[2] print m[0],'\t','wuli','\t',m[3]
select transform(name,huaxue,shuxue,wuli) using 'python process.py' as (name,leibie,score) from wxl_t3;