Hive学习笔记(二)——数据模型
一 hive 的五种数据模型
1 内部表
1)创建内部表
相当于MySQL的表 默认存储为的HDFS的目录 /user/hive/warehouse
create table emp
(empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int,
deptno int
)row format delimited fields terminated by ',';
2)导入数据
load data inpath '/scott/emp.csv' into table emp; -- 导入HDFS的数据,是剪切
load data local inpath '/root/temp/*****' into table emp; --导入本地Linux的数据,是复制
2 外部表
1)创建外部表
hive> create external table fz_external_table(id int,name string,age int,tel string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ','
> STORED AS TEXTFILE
> location '/user/hive/external/fz_external_table'; --hive外部表存储的位置
建外部表时要加external关键字,我在建表时指定了location,当然也可以不指定,不指定就默认使用hive.metastore.warehouse.dir指定的路径。
2)导入数据
提前准备好数据文件fz_external.txt,数据同上,只是换了个名。
1,fz,25,13188888888888
2,test,20,13222222222
3,dx,24,183938384983
4,test1,22,1111111111
导入操作:
hive> load data local inpath '/Users/FengZhen/Desktop/Hadoop/hive/testfile/fz_external_table.txt' into table fz_external_table;
Loading data to table default.fz_external_table
Table default.fz_external_table stats: [numFiles=0, totalSize=0]
OK
Time taken: 0.224 seconds
查看表内数据。
hive> select * from fz_external_table;
OK
fz 25 13188888888888
test 20 13222222222
dx 24 183938384983
test1 22 1111111111
Time taken: 0.06 seconds, Fetched: 4 row(s)
现在数据已经导入成功,接下来去HDFS中查看以下,在location指定的路径下
rooot@master$ hadoop fs -ls /user/hive/external/fz_external_table;
Found 1 items
-rwxr-xr-x 1 FengZhen supergroup 88 2017-06-06 13:44 /user/hive/external/fz_external_table/fz_external_table.txt
可以看到,往外部表中导入数据的时候,本地文件系统中的数据文件也被拷贝到了HDFS中。
现在来删除外部表,看一下HDFS中文件有没有被删除。
hive> drop table fz_external_table;
OK
Time taken: 0.103 seconds
外部表已经删除成功,看下HDFS中
root@master$ hadoop fs -ls /user/hive/external/fz_external_table;
Found 1 items
-rwxr-xr-x 1 FengZhen supergroup 88 2017-06-06 13:44 /user/hive/external/fz_external_table/fz_external_table.txt
可以看到,HDFS中数据文件在表被删除的情况下,还是存在的,也就是说删除外部表,只能删除表数据,并不能删除数据文件。
3 分区表
主要是为了优化查询,不需要扫描所有表里的数据,只要查看到对应的表的数据
1)创建分区表
create table art_dt(sentence string)
partitioned by (dt string)
row format delimited fields terminated by '\n';
2)插入数据
insert overwrite table art_dt partition(dt='20190420')
select * from art_ext limit 100;
insert overwrite table art_dt partition(dt='20190421')
select * from art_ext limit 100;--sql做数据的etl,或者统计分析等的处理逻辑
3)查看分区数
show partitions art_dt;
4 桶表
需要查询当前已经在hive中的表的数据进行分桶的,主要用来抽样查看数据!
1)创建桶表
–1.生成辅助表
数据文件bucket_test.txt
1
2
3
4
5
6
...
32
--1.生成辅助表
create table bucket_num(num int);
load data local inpath '/home/badou/Documents/data/hive/bucket_test.txt'
into table bucket_num;
–2.每个数字进入一个bucket
–2.1建表(表的元数据信息建立)
set hive.enforce.bucketing = true;
create table bucket_test(num int)
clustered by(num)
into 32 buckets;
2.2查询数据并导入到对应表中
insert overwrite table bucket_test
select cast(num as int) as num from bucket_num;
3) 抽样
--sample
select * from bucket_test tablesample(bucket 1 out of 32 on num);
--第一个bucket,00_0,32
select * from bucket_test tablesample(bucket 1 out of 16 on num);
--第1个和第17个bucket:00_0和16_0, 32和16
对于桶表关键点的理解是如何去抽样?对于此会单独写一篇博文来阐述.
--测试1/2个bucket:
set hive.enforce.bucketing = true;
create table bucket_test4(num int)
clustered by(num)
into 4 buckets;
insert overwrite table bucket_test4
select num from bucket_num;
select * from bucket_test4 tablesample(bucket 1 out of 8 on num);
--数据没有分桶,怎么采样数据?
select * from bucket_test4 where num%10>0;
5 视图
从MySQL的角度阐述视图:
视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,与基本表不同,它是一个虚表。在数据库中,存放的只是视图的定义,而不存放视图包含的数据项,这些项目仍然存放在原来的基本表结构中。
视图可以被定义为多个表的连接,也可以被定义为只有部分列可见,也可为部分行可见。
引入视图的原因:
1 可以简化SQL语句
2 提高数据的安全性
3 用户可以从不同的角度理解数据
4 视图是一个独立的逻辑表
引入视图带来的好处:
可以让开发人员将数据的关注点放到需要的数据上,而不需要去看那些不必要的数据而浪费时间,同时也提高了开发效率。
hive视图
hive的视图是不存数据的,换句话说目前版本不支持物化视图的。
1)创建辅助表
create table emp(name string,age int,gender string)
row format delimited fields terminated by ',';
导入数据
load data local inpath '/root/sutdent.txt' into table emp;
2)创建视图
create view test_view
as
select * from emp
3)查看视图数据
hive (default)> select * from test_view;
OK
lisa 18 女
Elia 22 女
jack 19 男
tom 17 男
Time taken: 0.403 seconds, Fetched: 4 row(s)
4)删除视图
drop view test_view; --跟删除表不一样
5)视图也可用来复制
--只是复制了表结构,并无数据
create table test_view2
like test_view
6)hive 视图需注意的几点:
- 视图是只读的,对于视图只允许改变员数据中的TBLPROPERTIES属性信息:
ALTER VIEW test_view SET TBLPROPERTIES(‘crated_at’='some_timestamp')
- 视图不能够作为insert语句或load命令的目标表
- 删除视图用 drop <mark>view</mark> test_view;
7) 查看视图元数据信息(对于其他数据模型也是适用的)
describe
hive (default)> desc test_view;
OK
name string
age int
gender string
Time taken: 0.136 seconds, Fetched: 3 row(s)
describe extended
hive (default)> describe extended test_view;
OK
name string
age int
gender string
Detailed Table Information Table(tableName:test_view, dbName:default, owner:root, createTime:1557252551, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:name, type:string, comment:null), FieldSchema(name:age, type:int, comment:null), FieldSchema(name:gender, type:string, comment:null)], location:null, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:null, parameters:{}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], parameters:{transient_lastDdlTime=1557252551}, viewOriginalText:select * from emp, viewExpandedText:select `emp`.`name`, `emp`.`age`, `emp`.`gender` from `default`.`emp`, tableType:VIRTUAL_VIEW, rewriteEnabled:false)
Time taken: 0.331 seconds, Fetched: 5 row(s)