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	17Time 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 view 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)

猜你喜欢

转载自blog.csdn.net/u013963379/article/details/89893788