hadoop学习笔记5-hive

一.hive基础

1.hive作用

将结构化数据文件映射成一张表
提供类似于sql的查询功能 HQL
存储在hdfs上

2.hive的内置数据库一般用mysql

为什么不用默认的内置数据库?

默认内置derby弊端,一台机器只支持一个客户端
比如你用xshell连接服务器之后通过bin/hive启动了hive,不关;
然后你再打开一个xshell,还去执行bin/hive命令,就会报错,因为被锁住了

3.hive和hadoop三大组件的结合

使用MapReduce进行计算;数据存储在HDFS上;运行在Yarn上

4.启动hive

    4.1 因为hive启动时候要连接hadoop  所以先启动hadoop再启动hive

    4.2 bin/hive 启动hive

5.启动hive

二.yum安装mysql时踩过的坑

我新租的阿里云服务器,使用yum安装hive的内置数据库mysql,一直不成功

我这安装打印如图,正常安装后还会打印很多日志的,比如生成的默认密码在哪个路径下

参考博客执行两个yum命令之后才好

[root@node1 ~]# yum install -y perl-Module-Install.noarch
[root@node1 ~]# yum install -y autoconf automake imake libxml2-devel expat-devel cmake gcc gcc-c++ libaio libaio-devel bzr bison libtool ncurses5-devel

后来查了一下,yum安装前需要执行这两个命令,作为环境准备。我这是新租的干净的阿里云服务器,什么都没有。

题外:

RPM 是 Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理
rpm -ivh   xxx.rpm安装以rpm结尾的文件
rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm

三.配置hive

1.配置hive-site.xml

这个hive-site.xml是需要我们在hive的conf路径下新建的

里边内容可以就四个:dburl,数据库驱动,用户名,密码

还可以再加两个,为了显示列信息和表信息

<!--列信息显示-->
<property>
	<name>hive.cli.print.header</name>
	<value>true</value>
</property>

<!--当前数据库信息显示-->
<property>
	<name>hive.cli.print.current.db</name>
	<value>true</value>
</property>

2.拷贝驱动包 

把mysql-connector驱动jar包拷贝到hive的lib下

3.日志文件配置

修改conf下的log.template文件,把.template去掉
修改dir日志文件生成路径
hive.log.dir=你自己的日志路径

4.自定义配置覆盖默认配置

正常会读取default.xml配置,但是如果hive-site.xml中有相同属性,会覆盖默认配置

比如我在hive-site.xml中加上了default数据库文件的存储路径,那么就会覆盖default.xml配置

 5.初始化

指定内置数据库为mysql

./schematool  -initSchema  -dbType mysql

6.重新启动hive

配置完之后重新启动hive,依然是要保证hadoop已经启动了才行

bin/hive

四.hive元数据存储在mysql

hive不是把数据存储在hdfs么,那mysql干什么?

hive元数据存储在mysql
元数据指hive版本号,hive中的表,表字段等

1.建表后产生的字段信息,字段类型,字段名

比如我在hive中建了一个表,有ss,addr等几个字段

2.表信息

下边是我在hive建了三个表,分别是employee2,employee,test

五.hive基本命令

1.hive建表语句

CREATE  TABLE `employee`(  
      `dept_no` int,   
      `addr` string,   
      `tel` string)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

最后需要指定拆分符号  这个符号是你自己指定的 我这里用的是逗号

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

如果不指定,会有默认的分隔符,个人建议指定的好

2.如何往表中插入数据?

1.从本地加载

load data local inpath '/root/soft/hive/apache-hive-3.1.2-bin/test.txt' into table employee;

load数据之后  在hdfs控制台 能看到  因为本身建表时候,在hdfs上就会有一个目录,比方我这个目录是employee,然后你要是把文件加载到这个表中,那么在employee下就会有一个 test.txt文件

2.从hdfs加载

把local去掉  inpath后边跟的路径就是hdfs路径

load data inpath '/user/hive/xiaoying/test.txt' into table ex2;

但是你注意一下,对于hdfs来说,这个动作相当于mv,源路径下这个文件就被移动走了

3.insert

就正常的insert语句

4.建表时候指定location路径

会把指定路径的数据都加载到表中

3.其他基本命令

1.bin/hive -h

帮助

在列出的列表中,有一些基本语句

2.bin/hive -f xxx.sql

执行一个sql文件

3.bin/hive -i xxx.sql

也是执行一个sql文件,与bin/hive -f的区别:bin/hive -i执行完sql文件之后打开控制台,bin/hive -f执行完sql文件之后不打开控制台

这是我用来测试的初始化文件init.sql

drop table if exists test.employee;
CREATE  TABLE `test.employeeT`(
      `dept_no` int,
      `addr` string,
      `tel` string)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
load data local inpath '/root/soft/hive/apache-hive-3.1.2-bin/test.txt' into table test.employee2;

4.查看表结构

desc employee;

对了,hive和Mysql命令相似,结尾也是需要加分号;的

5.查看表详细信息,包括分隔符

desc formatted test.employeeT;

6.查看hive建表语句

show create table tablename;

4.hive中操作hdfs文件

正常操作hdfs是hdfs dfs -ls / 这样一个命令,在hive命令行中,就是把第一个单词hdfs去掉:dfs -ls /

hive命令行运行普通命令,前边加!    如!ls log

5.bin/hive -e 执行sql

bin/hive -e "select count(*) from test.employeeT"

对于hive,简单的查询或者建表语句是不会触发mapreduce的,但是执行count这种计算函数时候会触发mapreduce

六.hive数据类型

1.hive基本数据类型

Hive数据类型	  Java数据类型		长度													例子
TINYINT			byte				byte有符号整数										20
SMALINT			short				byte有符号整数										20
INT				int					byte有符号整数										20
BIGINT			long				byte有符号整数										20
BOOLEAN			boolean	布尔类型,	true或者false										TRUE  FALSE
FLOAT			float				精度浮点数											3.14159
DOUBLE			double				精度浮点数											3.14159
STRING			string				字符系列。可以指定字符集。可以使用单引号或者双引号。	‘now is the time’ “for all good men”
TIMESTAMP		时间类型	
BINARY			字节数组

2.hive复杂数据类型

ARRAY  数组	  [‘John’, ‘Doe’]  
MAP    键值对  ’first’->’John’和’last’->’Doe
STRUCT 集合   {"name":"a","age":"14","sex":"man"}

反正目前我刚学我只用到郭string,int两种类型

七.hive存储格式

1.先了解下行存储和列存储

1.textfile(行存储):hive的默认存储方式
数据不做压缩,磁盘开销大
不会对文件切分,无法并行操作
2.sequencefile(行存储)
二进制存储,可分割可压缩
有三种压缩格式:none,block,record

3.RCFile(行列结合)
按行分块,(每块都)按列存储。比方123行放到一块,456行放到一块
4.ORC(行列结合)
读取速度快,压缩效率高。比RCFile快,是RCFile的改良版本
5.Parquet(列存储)
不支持update,insert,ACID
支持impala(我也不到这是啥)

总结:在hive中进行存储和查询,那么ORC首选,如果用impala(我也不到这是啥),用Parquet

以上,老师说先有这么个概念

2.建表时指定存储格式

stored as 存储格式

create table log_text (
  track_time string
 )
row format delimited fields terminated by '\t'
stored as textfile ;

3.不同存储格式,插入方式有区分

以下演示ORC表中怎么导入数据(如果你想直接从文件load导入,那你需要中间表,这个中间表存储格式就是默认的TEXTFILE,先把文件导入到中间表,在从中间表insert到ORC的表)

 

中间有过一个错误尝试,但是这个尝试证明了除了默认的textfile存储格式外,其余的几种都需要有中间表

八.外部表

1.外部表基本知识

未被external修饰的是内部表【managed table】,被external修饰的为外部表【external table】

外部表只是把表名和存储路径之间挂一个连接,比如我执行drop命令时,hive中的表会删除,但是hdfs上存储路径不会删除。

不管是内部表还是外部表,都可以通过location指向一个hdfs上的存储路径,

不同的是,drop操作的时候,如果是内部表,就算这个路径的文件,有其他表在使用,那也照删不误

2.创建外部表

跟内部表就差了个external

create external ex(s string) row format delimited fields terminated by '\t';

3.往外部表插入数据

与内部表一样,四种方式

下边这个命令是location方式

create external table ex2(s string,ss string,sss string) 
row format delimited fields terminated by '\t'
location '/user/hive/xiaoying/hive_test.db/ex';

不管是内部表外部表,如果是建表时候加location指向已经存在的文件夹,那么hdfs上就不会再新建一个路径
不管是内部表外部表,都有分区表,分桶表,普通表

九.分区表

1.创建分区表

create external table ex_part(s1 string,s2 string,s3 string) partitioned by(s_p string);

注意:分区字段不能和表中的字段重复

2.插入数据

插入数据时候需要指定分区(这个写死是静态分区,还有一个动态分区,还没讲呢)

load data inpath '/root/soft/hive/apache-hive-3.1.2-bin/test.txt' into table ex_part partition (s_p=1);

注意:新建表时是partitioned by  插入数据是partition

3.查询分区

show partitions table_name;

4.检索

select * from table_name where partition_field='****';

注:检索时如果不带分区字段,会进行全表扫描,比较慢

5.动态分区

在hive-site.xml中加一个property    hive.exec.dynamic.partition.mode=nonstrict

不要用set的方式,set的方式只针对于当前hive窗口,重启之后就不一定生效了

insert into table  ex_part partition (s_p) select * from shangchaun;

分区表,但是在load方法上,我确实没有找到如何不指定partition的情况下load数据
 load data local inpath '/root/soft/hadoop/hadoop-3.1.3/test_local.txt' into table part220 partition(s4=1);

十.其他DDL操作

1.创建表也可以用like

create table table1 like table2

但是like只拷贝表结构,不加载数据

2.修改表名

alter table1 rename to table2;

3.创建表之后,分隔符也是可以替换的(但是会对表中已有的数据产生影响)

alter table pwl_tong set serdeproperties('field.delim'='\t');

其中 field.delim 这个属性,在查看表结构详细信息是可以看到的

4.添加列

alter table pwl_tong add columns(s5 string);

5.替换列

(并不是把s5替换为s6,而是表里只留s5和s6,其余字段都删除)

alter table pwl_tong replace columns(s5 string,s6 string);

6.修改列

 

7.调整列的位置

十一.桶表

1.基本信息

分桶,分桶表的实质,就是对分桶的字段做了hash 然后存放到对应文件中
分桶将整个数据内容安装某列属性值得hash值进行区分
用于抽样查询:
在处理大规模数据集时,在开发和修改查询的阶段,可以使用整个数据集的一部分进行抽样测试查询、修改。可以使得开发更高效。
分桶是相对分区进行更细粒度的划分
分区提供了一个隔离数据和优化查询的便利方式,不过并非所有的数据都可形成合理的分区,尤其是需要确定合适大小的分区划分方式
与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列

这个是网上说的

Reduce个数与bucket个数一致
总结:我们发现其实桶的概念就是MapReduce的分区的概念,两者完全相同。
物理上每个桶就是目录里的一个文件,一个作业产生的桶(输出文件)数量和reduce任务个数相同。

而分区表的概念,则是新的概念。
分区代表了数据的仓库,也就是文件夹目录。
每个文件夹下面可以放不同的数据文件。通过文件夹可以查询里面存放的文件。
但文件夹本身和数据的内容毫无关系。
桶则是按照数据内容的某个值进行分桶,把一个大文件散列称为一个个小文件。

2.num buckets

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值