本文共 1720 字,大约阅读时间需要 5 分钟。
内部表与外部表
创建内部表语句
create table student(
id string,
name string
) row format delimited fields terminated by 't';
创建外部表语句
create external table student(
id string,
name string
) row format delimited fields terminated by 't';
通过 external 关键词来进行区分
因为外部表更多用于引用外部的数据,也不希望对原始数据继续破坏,所以要配合location来指定外部表要读取数据的位置
删除内部表或者清空都会将数据真正的删除,如果是外部表,只会讲我们表的关联信息删除掉,对我们指定位置下的内容没有任何影响
当然不是说内部表就不能使用location
load data inpath(从hdfs上进行数据导入就会将我们的数据移动到table所使用的目录下)
分区表
相当于在表中又分了小表
作用是可以减小我们有一定条件时的查询数据量,提升我们的查询效率
分区不是只能有一层的,我们可以创建多层的形式,即小表中在创建小表
create table whtime(id int,name string)
partitioned by(year string,month string)
row format delimited fields terminated by 't';
创建好分区后要进行数据的导入,在这里需要制定好将数据导入到哪个分区,否则不知道哪个分区
比如两个分区的话,需要指定
load data inpath '/dbdata/user.log' into table whtime partition(year='2018',month='01');
或
insert into birthday partition(month='01')
select id,name,month from persons where month = '01';//
分区表的信息查看
show partitions 表名
动态分区
使用场景:
当我们想对数据进行分区的时候,你拿到的数据却未必是已经分好区的文档,并不能直接load进就能用
这时候我们进程使用动态分来解决这种问题
列如:
+————-+—————+—————-+—————–+–+
| persons.id | persons.name | persons.month | persons.gender |
+————-+—————+—————-+—————–+–+
| 1 | tabn | 02 | man |
| 2 | sdasd | 03 | man |
| 3 | jsjuiw | 04 | man |
| 4 | kloie | 05 | man |
| 5 | slfdfj | 05 | man |
| 7 | nvshen | 10 | women |
| 8 | nvshenjin | 09 | women |
| 9 | xiaomimei | 10 | women |
| 10 | xiaobai | 01 | women |
+————-+—————+—————-+—————–+–+
给你如上文档,让你把数据加入到按月份分区的表中1.将混乱的数据传到一个表中
2.创建对应的分区表
3.向分区表动态分区的插入数据
insert into birthday partition(month)
select id,name,month from persons;
- 3.1如果要进行动态分区,就不要在partition(month)中设置固定值,不然就不是动态分区了
- 3.2默认使用的是严格模式,是不允许动态分区的,我们在命令行执行set hive.exec.dynamic.partition.mode=nonstrict;
- 3.3使用动态分区会将查询结果集的最后一个作为分区条件,所以select查询要注意
转载地址:https://blog.csdn.net/weixin_33587731/article/details/116389347 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!