您的位置:首页 > 运维架构

Hive的表的创建及外部表、分区表介绍

2017-11-04 14:12 435 查看
Hive的表的创建(内部表)及外部表、分区表详细介绍

那么Hive中管理表(内部表)和外部表的区别是什么,及分区表使用场景?
⑴ 三者区别:
①Hive创建内部表时(默认创建内部表),会将数据移动到数据仓库指向的路径;
②创建外部表(需要加关键字external),仅记录数据所在的路径,不对数据的位置做任何改变;
③Hive删除表时,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据;
⑵ 使用场景:
①外部表:比如某个公司的原始日志数据存放在一个目录中,多个部门对这些原始数据进行分析,那么创建外部表是明智选择,这样原始数据不会被删除;
②内部表:对原始数据或比较重要的中间数据进行建表存储;
③分区表:将每个小时或每天的日志文件进行分区存储,可以针对某个特定时间段做业务分析,而不必分析扫描所有数据;

(3)创建表的三种方式

# 指定标的类型和表的名称
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
# 指定每列的名称和类型
[(col_name data_type [COMMENT col_comment], ...)]
# 对表的说明
[COMMENT table_comment]
# 指定分区表的列名称,列类型
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
# 指定每列的分隔符、数据类型的类型
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
]
# 指定数据文件存储在HDFS的什么位置
[LOCATION hdfs_path]
# 表的属性设置
[TBLPROPERTIES (property_name=property_value, ...)]
# 子查询
[AS select_statement];


1、创建员工表和部门表

CREATE TABLE
IF NOT EXISTS emp(
empno INT ,
ename string ,
job string ,
mgr INT ,
hiredate string ,
sal DOUBLE ,
comm DOUBLE ,
deptno INT
) ROW format delimited FIELDS TERMINATED BY '\t';


CREATE TABLE
IF NOT EXISTS dept(
deptno INT ,
dname string ,
loc string
) ROW format delimited FIELDS TERMINATED BY '\t';


2、第二种创健方式:把子查询的结果作为一张新表。适用于需要保存查询的中间结果

创建格式

与第一种格式相同,需要注意 子查询要放在最后。

CREATE TABLE IF NOT EXISTS empcopy
AS
SELECT * FROM emp;


3、第三种创建方式:复制另外一个表的结构。

创建格式

create table tablename1 like tablename2; 创建表1且和表2 的表结构和属性完全一样,但不复制表2中的数据,所以表1的数据为空。

CREATE TABLE IF NOT EXISTS empcopy2
like emp;

(4)加载数据
格式:load data [local] inpath 'filepath' [overwrite] into table table_name [partition(partcol=val1,partcol2=val2...)]

参数解释:local表示是否从本地文件系统寻找文件,默认的是从hdfs上寻找文件;overwrite表示是否覆盖表中已有的数据。

hive > load data local inpath '/opt/datas/emp.txt' overwrite into table emp;
hive > load data local inpath '/opt/datas/dept.txt' overwrite into table dept;


(5)Hive两种表类型:内部表和外部表

5.1、 创建外部表方法一
如果在创建表时不指定external关键字,则默认的是创建管理表(内部表),内部表对应的目录必须存储在hive的数据仓库中。



5.2、创建外部表方法二

还有一种表是指定external关键字的表,即外部表,外部表的数据文件可以自己指定目录(不在局限于hive数据仓库中),指定对的目录下面的数据文件及为这个表的数据文件。

如何创建外部表。location指定的是hdfs上的目录,该目录表示的是这个外部表目录,这个目录下的文件即为这个表的数据文件

CREATE external TABLE test_user(
user_id INT COMMENT 'userID' ,
user_name string COMMENT 'userName'
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/hive_hdfs_local_data';




5.3、内部表和外部表的区别

执行删除表命令操作时,对于内部表,会删除元数据和存储的数据,而对于外部表只会删除元数据库里的元数据信息,而不会删除存储的数据。这样可以防止多个部门同时使用一个表时,一个部门删除数据文件导致其他部门不能使用的情况。方便共享数据。

内部表默认存储在数据仓库中,而外部表一般通过location自己指定目录,便于存放在仓库外。


(6)Hive分区表

为什么有分区表?

如果把一年或者一个月的日志文件存放在一个表下,那么数据量会非常的大,当查询这个表中某一天的日志文件的时候,查询速度还非常的慢,这时候可以采用分区表的方式,把这个表根据时间点再划分为小表。这样划分后,查询某一个时间点的日志文件就会快很多,因为这是不需要进行全表扫描。

hive中的分区表

hive中的分区是根据“分区列”的值对表的数据进行粗略的划分,hive中一个表对应一个目录,再根据分区列在这个表目录下创建子目录,每个子目录名就是分区列的名字。分区列定义与表中字段相似,但是与表中的字段无关,是独立的列。这样就加快了数据查询的速度,因为不会对这个表中进行全盘扫描了。

总之,建立分区可以理解为给hive表建立了一个索引,查询hive表时可以以分区作为条件,而不需要遍历整张表。


6.1、创建分区表

CREATE TABLE
IF NOT EXISTS emp_part(
empno INT ,
ename string ,
job string ,
mgr INT ,
hiredate string ,
sal DOUBLE ,
comm DOUBLE ,
deptno INT
)
partitioned by (date_str string)
ROW format delimited FIELDS TERMINATED BY '\t';


6.2、分区和不分区创建同样字段的表格,最终形成的表格结构会有如下不同:即创建分区的hive表比不创建的多一个分区字段

hive> desc emp_part;
OK
empno               	int
ename               	string
job                 	string
mgr                 	int
hiredate            	string
sal                 	double
comm                	double
deptno              	int
date_str            	string

# Partition Information
# col_name            	data_type           	comment

date_str            	string
Time taken: 0.105 seconds, Fetched: 14 row(s)
hive> desc emp;
OK
empno               	int
ename               	string
job                 	string
mgr                 	int
hiredate            	string
sal                 	double
comm                	double
deptno              	int
Time taken: 0.06 seconds, Fetched: 8 row(s)
hive>

6.3、向分区表中加载数据

hive> load data local inpath '/Users/a6/Applications/apache-hive-2.3.0-bin/result_data/dept_info.txt' into table emp_part partition(date_str='2017-11-03')
> ;
Loading data to table yyz_workdb.emp_part partition (date_str=2017-11-03)
OK
Time taken: 0.809 seconds

再次加载数据

hive> load data local inpath '/Users/a6/Applications/apache-hive-2.3.0-bin/result_data/dept_info_new.txt' into table emp_part partition(date_str='2017-11-04')
> ;
Loading data to table yyz_workdb.emp_part partition (date_str=2017-11-04)
OK
Time taken: 0.549 seconds

6.3.1、查看两次加载数据后的hive表的结果

hive> select * from emp_part;
OK
1007	李华	前端开发	200	20171001	10000.0	20000.0	110	2017-11-03
1008	小明	数据挖掘工程	201	20170626	17000.0	23000.0	120	2017-11-03
1007	李华	前端开发	200	20171001	10000.0	20000.0	110	2017-11-04
1008	小明	数据挖掘工程	201	20170626	17000.0	23000.0	120	2017-11-04
Time taken: 0.164 seconds, Fetched: 4 row(s)

6.3.2、显示该表格的分区信息

hive> show partitions emp_part;
OK
date_str=2017-11-03
date_str=2017-11-04
Time taken: 0.109 seconds, Fetched: 2 row(s)

6.3.3、另一种查看表格分区表的格式的方法:

show create table 表名;

如果是这个表有分区的话,可以看到显示的内容里有partition,partition里面跟的就是分区列名。

hive> show create table emp_part;
OK
CREATE TABLE `emp_part`(
`empno` int,
`ename` string,
`job` string,
`mgr` int,
`hiredate` string,
`sal` double,
`comm` double,
`deptno` int)
PARTITIONED BY (
`date_str` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim'='\t',
'serialization.format'='\t')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://localhost:9002/user/hive/warehouse/yyz_workdb.db/emp_part'
TBLPROPERTIES (
'transient_lastDdlTime'='1509778415')
Time taken: 0.097 seconds, Fetched: 24 row(s)


6.3.4 通过hadoop命令行查看已经创建的hive表的分区信息

localhost:result_data a6$ hadoop dfs -ls /user/hive/warehouse/yyz_workdb.db/emp_part
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

17/11/04 17:32:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
drwxr-xr-x   - a6 supergroup          0 2017-11-04 15:08 /user/hive/warehouse/yyz_workdb.db/emp_part/date_str=2017-11-03
drwxr-xr-x   - a6 supergroup          0 2017-11-04 15:16 /user/hive/warehouse/yyz_workdb.db/emp_part/date_str=2017-11-04
localhost:result_data a6$
localhost:result_data a6$ hadoop dfs -ls /user/hive/warehouse/yyz_workdb.db/emp_part/date_str=2017-11-03
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

17/11/04 17:37:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rwxr-xr-x   1 a6 supergroup        138 2017-11-04 15:08 /user/hive/warehouse/yyz_workdb.db/emp_part/date_str=2017-11-03/dept_info.txt
localhost:result_data a6$ hadoop dfs -cat /user/hive/warehouse/yyz_workdb.db/emp_part/date_str=2017-11-03/dept_info.txt
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

17/11/04 17:37:29 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
1007	李华	前端开发	200	20171001	10000	20000	110	2017-10-02
1008	小明	数据挖掘工程	201	20170626	17000	23000	120	2017-06-28

每一个分区都会有一个独立的文件夹,下面是该分区所有的数据文件


参考链接:http://www.jianshu.com/p/265456b606dc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hive hadoop