架构师训练营第十二周作业
分析如下 HiveQL,生成的 MapReduce 执行程序,map 函数输入是什么?输出是什么,reduce 函数输入是什么?输出是什么?
INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age
FROM page_view pv
JOIN user u
ON (pv.userid = u.userid);
Mapper
Join 过程涉及到两个输入源(表):`page_view`和`user`,相应的有两个不同的 Mapper 处理不同来源的数据。不过这两个 Mapper 的输入和输出的 key-value 类型都相同。
输入
LongWritable -> Text
Key
Mapper 输入 key 类型为:`LongWritable`,代表着数据文件的偏移量;
Value
Mapper 输入 value 类型是:`Text`,包含各自文件/表中的一行记录。
输出
Text -> TextPair
Key
为了让特定用户的 page 相关数据和用户信息将被 shuffle 到相同的 Reducer,我们使用`userid`作为 key,因此 key 的类型为`Text`。
Value
对于`user`表,Mapper 需要输出`age`;对于`page_view`表,Mapper 需要输出`pageid`。
但是 Value 中仅仅包含原始数据是不够的,因为在 Reduce 过程中我们无法区分数据到底是 age 还是 pageid,因此我们还需要在 Value 中增加一个 tag,不同的 tag 代表不同的数据源,这样处理时,我们根据 tag 就可以知道当前的 value 的含义。因此,Value 的类型是一个二元组:`TextPair`。其中,第一个成员表示数据源 tag,第二个成员则是相应的原始数据。
Reducer 输入
Text -> TextPair
Key
和 Mapper 的输出 key 类型相同:`Text`,代表特定用户的 id。
Value
经过排序和 group 后得到的某个用户的所有数据,包括该用户的 age 信息和浏览页面信息。
Reducer 输出
Text -> TextPair
Key
和 Mapper 的输出 key 类型相同:`Text`,代表特定用户的 id。
Value
经过处理后得到的`pageid`和 `age`。
评论