Hive SQL 语法本质上分为 3 类:过滤模式、聚合模式、连接模式。
今天介绍聚合。
【Hive】MapReduce 如何实现 Hive SQL 的基本操作-distinct
count 分如下三种:
select count(score) from stu_tb;
MR 伪代码:
map(inkey, invalue, context):
# 输入在 MR 看来只是字符串
colsArray = invalue.split("\t")
score = colsArray[4]
# 将数据输出到 combine,每一行记录都会保存到 invalues 集合
context.write(null, score)
combine(inkey, invalues, context):
long part_sum = 0
part_sum = invalues.size()
context.write(null, part_sum)
reduce(inkey, invalues, context):
long all_sum = 0
# 将 combine 中汇总的数据进行加总,得到最终记录数
for item in invalues:
all_sum +== item
context.write(null, all_sum)
set hive.map.aggr=true;
select count(*) from stu_tb;
MR 伪代码:
map(inkey, invalue, context):
context.write(null, inkey)
combine(inkey, invalues, context):
# 逻辑和 count(列) 一致
...
reduce(inkey, invalues, context):
# 逻辑和 count(列) 一致
...
set hive.map.aggr=true;
select count(1) from stu_tb;
MR 伪代码:
map(inkey, invalue, context):
# 不对 invalue 进行操作,直接输出,invalue 就是 1
context.write(null, invalue)
combine(inkey, invalues, context):
# 逻辑和 count(列) 一致
...
reduce(inkey, invalues, context):
# 逻辑和 count(列) 一致
...
count(列) 是针对列的计数,而 count(1) 和 count(*) 是针对表的计数。
count(列) 涉及字段的筛选,序列化与反序列化,所以 count(1) 和 count(*) 的性能占优。
但在 ORC 文件中性能差别不大。