Hive为大规模的数据分析提供了一种类SQL的查询语言,在数据仓库中是一种很常见的工具。
1. 排序和聚合
排序使用常规的ORDER BY来完成,Hive在处理ORDER BY请求时,并行排序,最终产生一个全局排序结果。如果全局有序不是必须的,那么可以使用Hive的非标准扩展SORT BY,它返回的是一个局部有序的结果,每个Reducer内部有序,每个Reducer产生一个有序的文件。
有时候我们想控制数据去往哪个Reducer以便进行下一步处理,这时候可以使用Hive的DISTRIBUTED BY
操作。下面的语句中,年份相同的数据被分发到同一个Reducer,在Reducer内部进行排序:
FROM records2
SELECT year,temperature
DISTRIBUTED BY year
SORT BY year ASC, temperature DESC;
下一步的处理就可以基于相同年份的数据被分组并排序这一点进行相应的操作,也可以将上述语句作为子查询嵌入。如果SORT BY和DISTRIBUTED BY的字段一样,可以简化为CLUSTER BY。注意区别于分桶中的CLUSTERED BY.
2. MapReduce脚本
使用类似于Hadoop Streaming的方式,TRANSFORM,MAP,REDUCE从句使得我们可以在Hive中调用外部程序(脚本)。例如,我们使用下面的Python脚本来过滤脏数据:
#!/usr/bin/env python
import re
import sts
for line in sys.stdin:
(year,temp,q) = line.strip().split()
if ( temp != "9999" and re.match("[01459]" ,q)):
print "%s\t%s" % (year,temp)
上面的脚本非常独立,我们很容易测试和开发。接着如下使用这个脚本:
ADD FILE /user/root/python/is_good_quality.py;
FROM records
SELECT TRANSFORM(year,temperature ,quality)
USING 'is_good_quality.p