hive的数据类型支持有好多种。
那么hive的表类型有哪些呢?
今天就来对其进行整理:
1 | 内部表和外部表 |
首先贴上官方文档地址:LanguageManual DDL - Apache Hive - Apache Software Foundation
内部表和外部表
未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
区别
内部表数据由Hive自身管理,外部表数据由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),
外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
- 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
- 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(
MSCK REPAIR TABLE table_name
;)
应用场景
对于一些公共的数据源使用外部表。对于保存的一些业务维度表或者是统计好的报表使用管理表(内部表)
查看表信息
1 | desc formatted student2; |
内部表和外部表互换
1 | alter table student2 set tblproperties('EXTERNAL'='FALSE'); |
分区表
数据分区的概念以及存在很久了,通常使用分区来水平分散压力,将数据从物理上移到和使用最频繁的用户更近的地方,以及实现其目的。
hive中处理的数据在HDFS中 ,
1 | select * from tb_name where dt=2020-06-18 ; |
查询表中的数据是加载HDFS中对应表文件夹下的数据 ,文件夹下的数据很多,将数据全部加载以后再筛选过滤出数据, 显然效率低 ,Hive中的分区表起始就是根据某种维度将数据分文件夹管理 ,当安装这种维度查询的时候,直接从对应的文件夹下加载数,效率更高!
hive中有分区表的概念,我们可以看到分区具重要性能优势,而且分区表还可以将数据以一种符合逻辑的方式进行组织,比如分层存储
分区表分别有静态分区和动态分区 !
分区表详情推荐阅读以下内容。
大数据开发之Hive篇19-Hive分区表详解 - 知乎 (zhihu.com)
静态分区表
动态分区表
上述是静态分区 , 静态分区是数据原本已经安装某维度保存在了不同的文件中了 , 如果想要根据查询的数据的某个属性进行分区 ,就是动态分区!
数据如下 ,想要根据性别, 或者是地理位置来进行分区,那么就是根据每个属性的值来进行分区的!!
1 | user.txt |
2.2.1 创建一个普通表 导入数据
1 | create table if not exists tb_user( |
2.2.2 创建分区表
1 | create table if not exists tb_p_user( |
2.2.3 开启动态分区功能
1 | set hive.exec.dynamic.partition=true ; |
2.2.4 动态导入数据
普通表5个字段
分区表 5个主字段 1 个分区字段
插入数据的时候字段个数类型一致 最后一个字段就是分区字段
1 | insert into tb_p_user partition(addr) |
分桶表
对Hive(Inceptor)表分桶可以将表中记录按分桶键(字段)的哈希值分散进多个文件中,这些小文件称为桶。
分区针对的是数据的存储路径;分桶针对的是数据文件。
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区,特别是之前所提到过的要确定合适的划分大小这个疑虑。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。
把表或分区划分成bucket有两个理由
1,更快,桶为表加上额外结构,链接相同列划分了桶的表,可以使用map-side join更加高效。
2,取样sampling更高效。没有分区的话需要扫描整个数据集。
4.1 数据
将数据分文件存储 , 类似于分区
1 | uid name |
4.2 创建分桶表
1 | create table if not exists tb_cluster( |
查看表的分桶信息
1 | desc formatted tb_cluster ; |
4.3 创建普通表 导入数据到普通表中
1 | create table if not exists tb_cluster2( |
4.4 开启分桶
1 | set hive.enforce.bucketing=true; |
4.5 基于查询的方式将数据导入到分桶表中
1 | insert into table tb_cluster |
4.6 原理
就是将数据按照指定的分桶字段进行hashcode%桶数 ,类似于MR程序中的数据分区
在HDFS文件系统中数据存储
5 抽样查询
对于非常大的数据集,有时用户需要使用的只是一个具有代表性的查询结果,而不是全部结果。Hive可以通过对表进行分桶抽样来满足这个需求。
5.1 分桶抽样
1 | select * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON number); |
其中tablesample
是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)
。y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32时,抽取(64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表示从哪个bucket开始抽取。例如,table总bucket数为32,tablesample(bucket 3 out of 16)
,表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。
5.2 数据库抽样
Hive提供了另外一种按照抽样百分比进行抽样的方式,这种是基于行数的,按照输入路径下的数据块百分比进行抽样。
1 | select * from numbersflat TABLESAMPLE(0.1 PERCENT) s; |
这种抽样方式不一定适用于所有的文件格式。另外抽样的最小抽样单元是一个HDFS数据块。如果标的数据大小小于普通的块大小128MB,那么会返回所有的行。
抽样查询使用于hive中的任意表, 只不过分桶表抽样效率更高!!