第三天 星期三
上午:
老师首先讲了Hive的背景知识:
- Hive是一个构建于Hadoop顶层的数据仓库工具,可以管理和分析海量数据(这时我产生了一个问题,数据库和数据仓库有什么区别呢?查阅资料知道传统数据库有以下几个缺点:a.结构复杂;b.数据脏乱;c.理解困难:存在大量语义不明的代码;d.缺少历史:传统数据库通常不会记录流变历史,这会使得某些基于历史的分析无法进行,数据仓库的产生就解决了这几个重要的问题。)
- 元数据存储在Hive中,数据存储在HDFS上;
- 关于Hive的系统架构上课也没有听太明白,课下边看笔记便查阅一下资料,总结到了以下的几点:
图 1系统架构图
上图为Hive的系统架构图,其中
a用户接口模块包括CLI、 HWI、JDBC、ODBC、 Thrift Server;
b.驱动模块(Driver)包括编 译器、优化器、执行器等, 负责把HiveSQL语句转换成 一系列MapReduce作业;
c.元数据存储模块( Metastore)是一个独立的关 系型数据库(自带derby数据 库,或MySQL数据库)。
下午:
- 首先进入Hive的客户端beeline;
登陆到服务器,cd到home目录下的client,使用source bigdata_env进行环境变量的配置,然后cd Hive/Beeline/bin下面,使用beeline命令进入Hive的客户端beeline,如下图所示:
图 2Hive的操作界面
- 接下来进行一系列的简单的命令操作:
命令:select length(‘fzfzfzfz’); 可以用来计算字符串的长度,如下图所示:
图 3计算字符串长度
命令:select reverse(‘fzfzfzfz’); 可以用来反转字符串,如下图所示:
图 4反转字符串
命令:select cancat(‘Mike’,’Mary’); 连接两个字符串,如下图所示;
图 5连接字符串
命令:select lower(‘ASD’); 返回字符串的小写模式,如下图所示:
图 6转换成字符串小写模式
命令:select trim(‘ ASD ’); 去除字符串两边的空格,如下图所示:
图 7去除字符串两端的空格
- Hive创建表
命令:create table cga_info144(name string,gender string,time int) row format delimited fields terminated by ',' stored as textfile;创建名字为cga_info144的表,该表有三列信息,分别是名字,性别,年龄,如下图所示:
图 8在Hive创建表
命令:show tables like cga_info100; 用来查看刚刚建立的表,如下图所示:
图 9查看所建立的表
- 载入本地数据:载入本地数据的流程是,建立本地文件,先将本地文件上传到HDFS分布式文件系统上,然后再载入到Hive上面,而不能直接将本地文件载入到Hive上面,这是不行的,具体命令如下所示:
touch ‘cga111.dat’ vim ‘cga111.dat’,建立本地文件cag111.dat并用vim命令启动编辑模式,内容如下:
图 10cga111.dat文件内容
用逗号作为每一行的结束符号,用编辑完毕后用 :wq! 保存,接下来将文件上传到HDFS分布式文件系统上上面,使用命令 hdfs dfs -put ‘本地文件路径’,最后将上传好的文件载入到刚刚建立的cga_info100中,使用命令:load inpath ’HDFS上面的文件路径’ into table info_cga100; 完成这一步后就可以使用select * from cga_info100; 命令来查看载入数据完毕后表的内容.
- Hive Jion 操作:
指令join 是将两个表的信息进行关联,只返回两个表的共有的结果,命令 select * from cga_info12 a join cga_info144 b on a.name=b.name;表示将两个表中name这一属性相同的信息全部显示出来,取并集,inner join 和join的用法是是一样的,输出也是一样的;
指令 left join是将该指令前面的表作为主表,返回记录和主表的记录数一致,如果关联不上就设置为NULL,比如select * from cga_info9 a left join cga_info8 b 0n a.name=b.name;
而right join和left join正好相反是将join关键词后面的作为主表;
指令 full join 是以两个表的记录为基准,返回两个表记录去重之和,关联不上的字段设为NULL,select * from cga_info9 a full join cga_info12 b on a.name=b.name;
指令left semi join 以指令前面的表作为主表,返回主表的KEY也在副表中的记录,select * from cga_info1 a left semi join cga_info2 b on a.name=b.name;
指令 map join 适用于小表join大表的场景,并且不需要启动Reduce任务,从而也就不需要经过shuffle阶段,从而在一定程度上节省资源提高join效率。
具体命令操作 select /*+mapjoin(age)*/* from cga_info9 a join cga_info8 b on a.name=b.name; 意思是:先将两个表中相同的名字记录下来,然后从cga_info这个表中相同名字所对应的age。