Hive知识积累

每天写很多Hive语句,写来写去逻辑也就那些,整理一下。

Hadoop、Spark这些大数据引擎的底层语言都比较复杂,写起来比较困难。因此Hive与Spark SQL应运而生。它们相当于一个翻译工具,把数据科学家(搬砖工)的SQL语句转换成Hadoop、Spark可以执行的语言。这样既方便了大家进行数据操作(SQL逻辑比较简单),而且易读易维护性也较强。

Hive基于分布式引擎,跟其他传统数据库比起来响应速度还是比较慢的,针对T+1这种需求还是很合适。

平时的函数逻辑比较简单。一些高级函数的掌握还是有必要的,有时候会省去很多麻烦。比如posexplode、lag、lead、str_to_map等,还有一些正则的常见表达式。

性能优化方面可以提升运行效率的点。

一个是在表join的时候。要注意把大表放在后面,因为Hive默认把大表放在后面,会把前面的小表放在缓存中,然后在大表上计算。如果不方便把大表放在后面,可以利用/*+ STREAMTABLE(..) */来指定大表。如果有个表比较小的话,可以用mapjoin直接将其放在内存中,在map阶段而非reduce进行join,这样就节省了在Shuffle阶段时要进行的大量数据传输,从而起到了优化作业的作用。在join时最好注意一下数据类型,提前转换好,也可以节省时间。

第二点是数据倾斜问题。这个相信大家实践中经常遇到,进度条(99+1/100),然后就不动了的情况。这是一般是由于数据分布不均匀,造成数据大量的集中到一点,在reduce的时候集中的这一块就计算的很慢,别人早就算完了就剩它自己还在跑。

set hive.groupby.skewindata=true;Hive自带的推测执行用于解决此问题,会有一个job将key随机打散。

另外一种做法就是手工用随机数来把key打散。

你可能感兴趣的:(Hive知识积累)