Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件。根据数据的不同存储方式,将Hive表分为外部表、内部表、分区表和分桶表四种数据模型。每种数据模型各有优缺点。通过create user命令创建user表时,会在HDFS中生成一个user目录/文件。

外部表

数据不由Hive管理,使用drop命令删除一个表时,只是把表的元数据给删除了,而表的数据不会删除。

创建外部表的SQL语句:

create external table bigdata17_user(
userid int,
username string,
fullname string)
row format delimited fields terminated by ','
lines terminated by '\n';

在hive的命令行中执行 show tables;sql语句,会看到bigdata17_user的表。

通过执行hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user 命令,可以看到在HDFS中有一个bigdata17_user的目录。这时候文件夹下面是没有数据的,因为还没有导入数据。bigdata17.db是数据库名,hive默认的数据库是default。



执行SQL语句:load data inpath '/data/user.csv' overwrite into table bigdata17_user;导入数据到bigdata17_user表中。

执行hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user命令,就看到该目录下面有个user.csv的文件。



通过drop table bigdata17_user;语句删除表。

然后执行show tables语句,发现该表已经不存在。

我们再次执行hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user,发现bigdata17_user目录还存在,目录中还有user.csv文件。



通过上述的操作,验证了使用drop删除表时是不会删除外部表的数据。而我们要恢复外部表只需再次执行创建bigdat17_user表的SQL即可:

create external table bigdata17_user(
userid int,
username string,
fullname string)
row format delimited fields terminated by ','
lines terminated by '\n';

内部表

内部表(有些人会翻译成管理表)的数据由hive管理,当使用drop删除表时,会把表的元数据和数据一起删除,数据无法恢复,因此一定要慎用drop删除内部表。

创建内部表的sql语句:

create table bigdata17_user( userid int, username string, fullname string)
row format delimited fields terminated by ','
lines terminated by '\n';

和外部表创建的语法基本一样,只是创建外部表需要使用external关键字。没有external关键字则是创建内部表。

分区表

内部表和外部表都可以使用分区的功能,使用分区的内部或外部表称为分区表。

创建分区表的语句:

create external table bigdata17_user_partition(
username string,
fullname string)
partitioned by(userid string)
row format delimited fields terminated by ','
lines terminated by '\n';

往分区表导入数据分为静态分区导入和动态分区导入,静态分区是在导入语句中指定分区值,例如:

insert overwrite table bigdata17-user_parttion
partition(userid=1)
select username ,fullname from bigdata17_user;

该语句的分区值默认是1,如果有多个分区值,必须写多个sql语句,效率低下。

一般情况在我们都是使用动态分区导入数据,

在导入数据之前必须执行下面的两条语句让hive支持动态分区功能,默认是不支持动态分区的。

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

动态分区导入数据的sql语句:

insert overwrite table bigdata17_user_partition
partition(userid)
select username ,fullname,userid from bigdata17_user;

我们来看下分区表的数据在hdfs中是以何种形式组织存放的,执行hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user_partition命令,会看到下图的内容:



因为bigdata17_user_partition表是按照userid字段进行分区的,bigdata17_user_partition一共有1、2和3的三个数值,因此有3个文件。由此可见,分区字段有多少个不同的值,就有几个文件。相同分区的数据存放在同一个文件中。

注意:在使用insert overwrite table select方式导入数据到分区表时,有多个分区字段时,分区partition中的字段顺序必须和select字段的顺序一致。

分桶表

分桶是将某个字段取哈希值,值相同的数据分发到一个桶中。在创建分桶表的时候必须指定分桶的字段,并且指定要分桶的数量。

创建分桶表对SQL语句如下:

create table bigdata17_user_bucket( userid int, username string, fullname string)
clustered by(userid) into 2 buckets
row format delimited fields terminated by ','
lines terminated by '\n';

导入数据到bigdata17_user_bucket分桶表中的步骤:

  1. 设置使用分桶属性: set hive.enforce.bucketing = true。
  2. 执行SQL语句
insert overwrite table bigdata17_user_bucket
select userid,username ,fullname from bigdata17_user;

执行 hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user_bucket命令,会看到bigdata17_user_bucket目录中有两个文件。



其中userid为1和3的数据写入到000001_0文件中,userid为2的数据写入到000000_0的文件中。

注意:分区和分桶都是按字段来组织数据的存放,分区是相同的字段值存放在一个文件中,而分桶是字段哈希值相同的数据存放在一个文件中。

一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据的更多相关文章

  1. Hive 学习之路(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...

  2. Hive 系列(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  3. 入门大数据---Hive分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  4. hive 分区表和分桶表

    1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...

  5. Hive SQL之分区表与分桶表

    Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...

  6. Hive 教程(四)-分区表与分桶表

    在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表. 概念 分区表 在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹: 可以通过多层文件夹 ...

  7. Hive(六)【分区表、分桶表】

    目录 一.分区表 1.本质 2.创建分区表 3.加载数据到分区表 4.查看分区 5.增加分区 6.删除分区 7.二级分区 8.分区表和元数据对应得三种方式 9.动态分区 二.分桶表 1.创建分桶表 2 ...

  8. Hive的分桶表

    [分桶概述] Hive表分区的实质是分目录(将超大表的数据按指定标准细分到指定目录),且分区的字段不属于Hive表中存在的字段:分桶的实质是分文件(将超大文件的数据按指定标准细分到分桶文件),且分桶的 ...

  9. 大数据学习----day27----hive02------1. 分桶表以及分桶抽样查询 2. 导出数据 3.Hive数据类型 4 逐行运算查询基本语法(group by用法,原理补充) 5.case when(练习题,多表关联)6 排序

    1. 分桶表以及分桶抽样查询 1.1 分桶表 对Hive(Inceptor)表分桶可以将表中记录按分桶键(某个字段对应的的值)的哈希值分散进多个文件中,这些小文件称为桶. 如要按照name属性分为3个 ...

随机推荐

  1. 使用mysql自带工具mysqldump进行全库备份以及source命令恢复数据库

    mysql数据库提供了一个很好用的工具mysqldump用以备份数据库,下面将使用mysqldump命令进行备份所有数据库以及指定数据库 一.mysqldump一次性备份所有数据库数据 /usr/lo ...

  2. mysqlfrm初步使用

    这个工具也就是读取frm文件生成建表语句默认的模式是再生个实例,使用--basedir选项或指定--server选项来连接到已经安装的实例.这种过程不会改变原始的.frm文件.该模式也需要指定--po ...

  3. use Swig to create C/C++ extension for Python

    SWIG is a software development tool that simplifies the task of interfacing different languages to C ...

  4. python学习第16天。

    内置函数是在原本已经有的序列的基础上,再生成新的. List的方是修改原列表. 内置函数中大部分函数的返回值大部分都是迭代器.生成器. Sorted需要遍历操作,不是单纯的迭代,所以不生成迭代器. 一 ...

  5. Java RMI与RPC的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html  一:RPC 远程过程调用 RPC(Remote Procedure Call Prot ...

  6. JavaScript 删除某个数组中指定的对象

    返回对象在数组中的下标: _arr表示一个Array数组,里面包括了很多的对象如下图: _obj表示某一个数组对象     function getIndex (_arr,_obj) { var le ...

  7. IntelliJ IDEA插件 - ApiDebugger

    IntelliJ IDEA插件 - ApiDebuggerApiDebugger,是一个开源的接口调试IntelliJ IDEA插件,具有与IDEA一致的界面,无需切换程序即可完成网络API请求,让你 ...

  8. hive学习04-员工部门表综合案例

    知识点: 格式转换:cast(xxx as int) 按某列分桶某列排序,排序后打标机:例如:求每个地区工资最高的那个人的信息: ROW_NUMBER() OVER(PARTITION BY COLU ...

  9. Mac配置Jdk 安装及系统环境配置

    注:本文来于<  Mac配置Java开发环境    > 1. 下载JDK 从下面链接选择合适版本的安装包进行下载...笔者下载的是jdk-9.0.1 链接:http://www.oracl ...

  10. 使用 mod_rewrite 来修改 Confluence 6 的 URLs

    备注:这个页面的文档是 Apache 的配置,而不是 Confluence 自己的配置.Atlassian 将会对 Confluence 的配置提供支持,但是我们不能保证能够对你所有在配置 Apach ...