12.6 大数据仓库 Hive
1.如果用 MapReduce 实现下面语句?
不同年龄段对页面的喜好。PV_Users.
单独一天的数据可记录数据库。如果统计一年的数据,数据则是万亿级规模,普通数据库无法存储,普通数据库 SQL 计算无法执行。
==>数据存储使用 HDFS,统计使用 MapReduce。
直接写 MapReduce 程序,比较复杂,是否有工具将 SQL 语句直接转化为 MapReduce 程序。
==>Hive.
2.Hive 实现查询原理
3.Hive 命令
hive> CREATE TABLE pokes(foo INT,bar STRING)
hive> SHOW TABLES;
hive> ALTER TABLE pokes ADD COLUMNS(new_col INT);
hive> DROP TABLE pokes;
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15'
3.Hive 架构
解析:
Metastore: 元数据:表名称,字段名称,字段类型。
Client 获取 SQL,通过 Driver 驱动器,提交给 Compiler 编译器。
Compiler 把 SQL 编译成一个执行计划。编译过程:调用 Metastore 记录的表结果信息。
根据表结果信息把元数据关联起来,构建成一个 MapReduce 执行计划。
执行计划提交给 Hadoop。Hadoop 执行 MapReduce。
4.Hive 和 Hadoop 关系
5.Hive 编译器
Parser: 把 SQL 转换为抽象语法树(AST)
SemanOc Analyzer: 把抽象语法树转化为查询块(QB)
Logical Plan Generator: 把 QB 转换为逻辑执行计划(Logical Plan)
Logical OpOmizer:重写执行计划,带入更多的优化后的计划
Physical Plan Generator:将逻辑执行计划转化为物理执行计划(Map/Reduce Jobs)
Physical Opomizer: 适应性 Join 策略调整
6.Example Query(Filter)
Filter status updates containing 'michael jsckson'
SELECT * FROM status_updates WHERE status LIKE 'michael jackson'
7.Example Query(Aggregation)
Figure out total number of status_updates in a given day
SELECT COUNT(1) FROM status_updates WHERE ds='2009-08-01'
8.Hive QL-Join in Map Reduce
INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age
FROM page_view pv
JOIN user u
ON (pv.userid = u.userid);
语义分析: 相同 userid 的 pageid,age 数据合并。
逆向分析:
reduce 输出分析:reduce 数据合并输出列为(pageid,age)。
reduce 输入分析:因为 reduce 对相同 key 数据合并,(pageid,age)数据的相同 key 是 userid。
==>reduce 的输入 key:userid。
==>reduce 的输入 value:<数据来自哪张表,pageid>,<数据来自哪张表,age>
map 输出分析: reduce 的输入即为 map 的输出
==>map 的输出 key 为:userid。
map 的输出 value:page_view 表 map 输出 value:<表序号,pageid>,
user 表输出 value<表序号,age>
map 输入分析:page_view,user 表的行记录。
正向图解:
8.Hive QL-Join 优化
INSERT OVERWRITE TABLE pv_users
SELECT /*MAPJOIN(PV)*/ pv.pageid, u.age
FROM page_view pv
JOIN user u
ON (pv.userid = u.userid);
评论