Hive内部表和外部表的区别

面试题来源:

《大数据面试题 V4.0》

大数据面试题V3.0,523道题,679页,46w字

可回答:Hive分区和分桶的逻辑

参考答案:

1、定义上

分区

  • Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。

  • Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。

  • 所以可以这样理解,当我们在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。

注意:partitned by子句中定义的列是表中正式的列(分区列),但是数据文件内并不包含这些列。

# 创建分区表
 create table student(
 id int,
 name string,
 age int,
 address string
 )
 partitioned by (dt string,type string)                 # 制定分区
 row format delimited fields terminated by '\t'         # 指定字段分隔符为tab
 collection items terminated by ','                     # 指定数组中字段分隔符为逗号
 map keys terminated by ':'                             # 指定字典中KV分隔符为冒号
 lines terminated by '\n'                               # 指定行分隔符为回车换行
 stored as textfile                                     # 指定存储类型为文件
 ;
 ​
 # 将数据加载到表中(此时时静态分区)
 load data local inpath '/root/student.txt' into  test.student partition(class='一班');

分桶:

  • 分桶表是在表或者分区表的基础上,进一步对表进行组织,Hive使用 对分桶所用的值;

  • 进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。

注意:

创建分区表时:

  • 可以使用distribute by(sno) sort by(sno asc) 或是使用clustered by(字段)

  • 当排序和分桶的字段相同的时候使用cluster by, 就等同于分桶+排序(sort)

 # 创建分桶表
 create table student(
 id int,
 name string,
 age int,
 address string
 )
 clustered by(id) sorted by(age) into 4 buckets
 row format delimited fields terminated by '\t'
 stored as textfile;
 ​
 # 开启分桶
 set hive.enforce.bucketing = true;
 # 插入数据
 insert overwrite table studentselect id ,name ,age ,address from employees;
 # 也可以用另一种插入方式
 load data local inpath '/root/student.txt' into test.student;

2、数据类型上

分桶随机分割数据库,分区是非随机分割数据库。因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。

分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。桶是更为细粒度的数据范围划分,分桶的比分区获得更高的查询处理效率,使取样更高效。

注意:普通表(外部表、内部表)、分区表这三个都是对应HDFS上的目录,桶表对应是目录里的文件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值