实训第三天

第三天 星期三

上午:

老师首先讲了Hive的背景知识:

  1. Hive是一个构建于Hadoop顶层的数据仓库工具,可以管理和分析海量数据(这时我产生了一个问题,数据库和数据仓库有什么区别呢?查阅资料知道传统数据库有以下几个缺点:a.结构复杂;b.数据脏乱;c.理解困难:存在大量语义不明的代码;d.缺少历史:传统数据库通常不会记录流变历史,这会使得某些基于历史的分析无法进行,数据仓库的产生就解决了这几个重要的问题。)
  2. 元数据存储在Hive中,数据存储在HDFS上;
  3. 关于Hive的系统架构上课也没有听太明白,课下边看笔记便查阅一下资料,总结到了以下的几点:

图 1系统架构图

上图为Hive的系统架构图,其中

a用户接口模块包括CLI、 HWI、JDBC、ODBC、 Thrift Server;

b.驱动模块(Driver)包括编 译器、优化器、执行器等, 负责把HiveSQL语句转换成 一系列MapReduce作业;

c.元数据存储模块( Metastore)是一个独立的关 系型数据库(自带derby数据 库,或MySQL数据库)。

 

 

 

下午:

  1. 首先进入Hive的客户端beeline;

登陆到服务器,cd到home目录下的client,使用source bigdata_env进行环境变量的配置,然后cd Hive/Beeline/bin下面,使用beeline命令进入Hive的客户端beeline,如下图所示:

图 2Hive的操作界面

  1. 接下来进行一系列的简单的命令操作:

命令:select length(‘fzfzfzfz’); 可以用来计算字符串的长度,如下图所示:

图 3计算字符串长度

命令:select reverse(‘fzfzfzfz’); 可以用来反转字符串,如下图所示:

图 4反转字符串

命令:select cancat(‘Mike’,’Mary’);  连接两个字符串,如下图所示;

图 5连接字符串

命令:select lower(‘ASD’); 返回字符串的小写模式,如下图所示:

图 6转换成字符串小写模式

命令:select trim(‘  ASD   ’); 去除字符串两边的空格,如下图所示:

图 7去除字符串两端的空格

 

  1. 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查看所建立的表

  1. 载入本地数据:载入本地数据的流程是,建立本地文件,先将本地文件上传到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; 命令来查看载入数据完毕后表的内容.

  1. 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。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41503009/article/details/84102457