hive知识点记录

Hive的底层存储

Hive的数据是存储在HDFS上的。Hive中的库和表可以看作是对HDFS上数据做的一个映射。所以Hive必须是运行在一个Hadoop集群上的。

Hive语句的执行过程

Hive中的执行器,是将最终要执行的MapReduce程序放到YARN上以一系列Job的方式去执行。

Hive的元数据存储

Hive的元数据是一般是存储在MySQL这种关系型数据库上的,Hive和MySQL之间通过MetaStore服务交互。

Hive重要概念

外部表和内部表
内部表(managed table)
默认创建的是内部表(managed table),存储位置在hive.metastore.warehouse.dir设置,默认位置是/user/hive/warehouse
导入数据的时候是将文件剪切(移动)到指定位置,即原有路径下文件不再存在
删除表的时候,数据和元数据都将被删除
默认创建的就是内部表create table xxx (xx xxx)

外部表(external table)
外部表文件可以在外部系统上,只要有访问权限就可以
外部表导入文件时不移动文件,仅仅是添加一个metadata
删除外部表时原数据不会被删除
分辨外部表内部表可以使用DESCRIBE FORMATTED table_name命令查看
创建外部表命令添加一个external即可,即create external table xxx (xxx)
外部表指向的数据发生变化的时候会自动更新,不用特殊处理

分区表和桶表
分区(partioned)

有些时候数据是有组织的,比方按日期/类型等分类,而查询数据的时候也经常只关心部分数据,比方说我只想查2017年8月8号,此时可以创建分区,查询具体某一天的数据时,不需要扫描全部目录,所以会明显优化性能
一个Hive表在HDFS上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的
使用partioned by (xxx)来创建表的分区
分桶(clustered)
分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得hash值进行区分,按照取模结果对数据分桶。如取模结果相同的数据记录存放到一个文件。
桶表也是一种用于优化查询而设计的表类型。创建通表时,指定桶的个数、分桶的依据字段,hive就可以自动将数据分桶存储。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率。
具体说明分桶

clustered by (user_id) sorted by(leads_id) into 10 buckets
clustered by是指根据user_id的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同user_id的数据放入同一个桶中。

sorted by 是指定桶中的数据以哪个字段进行排序,排序的好处是,在join操作时能获得很高的效率。

into 10 buckets是指定一共分10个桶。

在HDFS上存储时,一个桶存入一个文件中,这样根据user_id进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提供查询效率。

HDFS中的LOCATION

一、
创建一个表test_select,location的位置在hdfs中的/data【此时/data下面是没有数据的】

create table test_select(name string,salary float) row format delimited fields terminated by '\t' lines terminated by '\n' location '/data';
select * from test_select;

此时test_select表中是没有数据的,因为/data下面没有数据且test_select中也没有导入数据。
现在往test_select 中导入数据

insert overwrite table test_select select name,salary from employee_test2;
select * from test_select;

现在test_select表中有数据存在,且/data下面也有数据了,查看data目录,发现多了一个文件

hadoop fs -ls /data

二、
再创建一个表 test_select_2,表结构和 test_select一样,location的位置也在/data【此时data下面有数据,就是test_select中的数据】

create table test_select_2(name string,salary float) row format delimited fields terminated by '\t' lines terminated by '\n' location '/data';
select * from test_select_2;

同样能够查出数据,这个数据就是test_select表中的数据,
所以,创建表时location那个目录下的数据,会被导入到该表,即使没有手动往该表导数据。
此时的/data目录
三、
创建表test_select_3,表结构和前面的表一样,没有定义location的位置,即默认在hdfs://localhost:9000/user/hive/warehouse/

create table test_select_3(name string,salary float) row format delimited fields terminated by '\t' lines terminated by '\n';
select * from test_select_3;

此时test_select_3中是没有数据的
然后将/data下面的000000_0文件中的数据传到test_select_3

load data inpath '/data/000000_0' into table test_select_3;  -- 移动数据不是复制数据
select * from test_select_3;

此时能够从test_select_3表中查出数据
但是【location在/data目录下的test_select和test_select_2中的数据也没有了】
同时 /data目录下已经没有文件

hadoop fs -ls /data -- 命令行内
-- 或者
dfs -ls /data; -- hive命令框内

四、
将result文件拷贝到/data目录下

hadoop fs -copyFromLocal /root/tyn_eg/hive/data/result /data/

data目录下多了个result文件
查看test_select和test_select_2表,都显示了result文件中的内容
如果再把文件result_copy拷贝到目录/data下面【result_copy的内容和result一样】

hadoop fs -copyFromLocal /root/tyn_eg/hive/data/result_copy /data/;
hadoop fs -ls /data

data目录下面现在有result和result_copy两个文件
查看此时test_select 和test_select_2表的内容
这两张location在data目录下的表,显示了result和result_copy两个文件的内容

总结
##官方注释
LOCATION一般与外部表(EXTERNAL)一起使用。一般情况下hive元数据默认保存在<hive.metastore.warehouse.dir>中。
EXTERNAL表指向其存储的任何HDFS位置,而不是存储在configuration属性指定的文件夹中hive.metastore.warehouse.dir

参考:
https://www.jianshu.com/p/e9ec6e14fe52
https://www.jianshu.com/p/41ac908641df

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值