笔记

**关于MapReduce原理与key/value由来见:[MapReduce原理](https://github.com/sunnyandgood/BigData/blob/master/MapReduce/MapReduce%E5%8E%9F%E7%90%86.md) + [Hadoop MapReduce原理及实例](https://blog.csdn.net/u010758410/article/details/79795041)** # 1、<font color=red>**MAP/REDUCE操作的key/value如何确定?**</font> **1. 对于 JOIN 操作:** - **Map:** 以 JOIN ON 条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合 以 JOIN 之后所关心的列作为 Value,当有多个列时,Value 是这些列的组合。在 Value 中还会包含表的 Tag 信息,用于标明此 Value 对应于哪个表。 按照 Key 进行排序。 - **Shuffle:** 根据 Key 的值进行 Hash,并将 Key/Value 对按照 **Hash** 值推至不同对 Reduce 中。 - **Reduce:** Reducer 根据 Key 值进行 Join 操作,并且通过 Tag 来识别不同的表中的数据。 例如:`select u.name, o.orderid from order o join user u on o.uid = u.uid;` ![image.png](https://cos.easydoc.net/17082933/files/kh78l7qy.png) **2. 对于Group by操作:** - **Map:** 以 Group by条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合 根据key值聚合 按照 Key 进行排序。 - **Shuffle:** 根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中。 - **Reduce:** Reducer 根据 Key 值进行 聚合 操作。 例如:`SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age; ` ![image.png](https://cos.easydoc.net/17082933/files/kh78ssko.png) **3. Distinct** 按照 age 分组,然后统计每个分组里面的不重复的 pageid 有多少个 `SELECT age, count(distinct pageid) FROM pv_users GROUP BY age;` ![image.png](https://cos.easydoc.net/17082933/files/kh78u6yd.png) >此时,将数据源的VALUE作为key输出,VALUE随意 <font color=#008000>**3. 对于其他操作**</font> 暂无 来源:[HIVE 的MAP/REDUCE](https://www.shuzhiduo.com/A/VGzlYZpVJb/) --- 关于:[面试官最爱问的「Hive调优」,17个切入点带你一举拿下](https://mp.weixin.qq.com/s?__biz=MzUzODYwMDAzNA==&mid=2247504808&idx=3&sn=1643567f6ff0fd1d1fdc20cfac4ce44e&chksm=fad7a4a5cda02db33094b514ece7ce605c5286132552d8f37183c96ae2ee2d54dbd09f711200&mpshare=1&scene=23&srcid=1102bELgOfBL4EeWnI2XyMeS&sharer_sharetime=1604712251481&sharer_shareid=e7aab36d78b279ccf29394736ce26e0f#rd)中第四点 **++怎样做笛卡尔积++**,举例为: > 另一种解决方案是: **额外构造join key (连接键)**,通过表连接操作代替笛卡尔积 操作,具体做法是将小表扩充一列join key,并将小表的条目复制数倍,且join key各不相 同;将大表扩充一列join key为小表扩充数倍之后数据总量范围内的随机数。例如,假设小 表中只有1条数据,大表中1000条数据,给小表添加一列join key,设其值为1,将该数据扩 充四倍,其join key的值分别为2〜5,大表中的join key,使用1〜5之间的随机数,比如有 200个1,200个2,200个3,200个4和200个5,此时,根据join key进行两个表的连接操作时, 就会产生5个reducer,同时将大表的数据随机分成了5份(小表扩展后的倍数),从而解决了 上述问题。但是,该解决方案的的本质仍然与笛卡尔积操作相同,其弊端是会造成数据的冗 余,且实际执行起来比较繁琐、效率低下。 --- # 2、[Hive设置map和reduce的个数](https://blog.csdn.net/B11050101/article/details/78754652) # 3、[Hive学习之抽样(tablesample)](https://blog.csdn.net/leen0304/article/details/78961941)