Hive管理表,也叫内部表。Hive控制着管理表的整个生命周期,默认情况下Hive管理表的数据存放在hive的主目录:/user/hive/warehouse/下,并且当我们删除一张表时,这张表的数据也会相应的被删除掉,在文件层面上讲,就是在Hive主目录下的表目录以及目录里面的数据文件都会被删除掉。

管理表能够有效的管理表的数据,但是不利于对数据的分享,同一份数据,我希望既能够指向表A,有能够分享给表B,但是相应的这些表不应该控制数据的生命周期,这种表在Hive里面成为外部表。在创建外部表的时候,需要指向数据的具体位置,相当于一个指针,外部表只是引用了数据的地址,访问表时再根据这个地址指针去找到相应的数据。

在管理大型数据集时,分区是一个有效的解决办法,能够根据分区条件限制访问的数据量大小,能够达到优化数据的访问速度。对于管理管的分区,上节已经详细讲解过了,本节将会针对外部分区表进行讲解。

1. 管理表创建:

CREATE TABLE IF NOT EXISTS emp(
empno STRING,
ename STRING,
job STRING,
mgr STRING,
hiredate STRING,
salary DOUBLE,
comm DOUBLE,
deptno STRING 
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t';

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ cat emp
7369 SMITH CLERK 7902 1980/12/17 1100.00 NULL 20
7499 ALLEN SALESMAN 7698 1981/2/20 1800.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1450.00 500.00 30
7566 JONES MANAGER 7839 1981/4/2 3275.00 NULL 20
7654 MARTIN SALESMAN 7698 1981/9/28 1450.00 1400.00 30
7698 BLAKE MANAGER 7839 1981/5/1 3050.00 NULL 30
7782 CLARK MANAGER 7839 1981/6/9 2450.00 NULL 10
7788 SCOTT ANALYST 7566 1987/4/19 3300.00 NULL 20
7839 KING PRESIDENT NULL 1981/11/17 5000.00 NULL 10
7844 TURNER SALESMAN 7698 1981/9/8 1700.00 NULL 30
7876 ADAMS CLERK 7788 1987/5/23 1400.00 NULL 20
7900 JAMES CLERK 7698 1981/12/3 1150.00 NULL 30
7902 F%FORD ANALYST 7566 1981/12/3 3300.00 NULL 20
7934 MILLER CLERK 7782 1982/1/23 1300.00 NULL 10

将数据导入到管理表中:

hive (jimdb)> LOAD DATA LOCAL INPATH './emp' OVERWRITE INTO TABLE emp;
Loading data to table jimdb.emp
Table jimdb.emp stats: [numFiles=1, numRows=0, totalSize=705, rawDataSize=0]
OK
Time taken: 0.983 seconds

查看相应的数据文件,文件目录如下:

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hdfs dfs -ls /user/hive/warehouse/jimdb.db/emp
Found 1 items
-rwxr-xr-x 2 hadoop supergroup 705 2018-06-12 06:27 /user/hive/warehouse/jimdb.db/emp/emp

删除管理表emp

hive (jimdb)> drop table emp;

OK
Time taken: 1.793 seconds

然后到数据库目录下查看表目录以及数据文件:

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hdfs dfs -ls /user/hive/warehouse/jimdb.db/
Found 8 items
drwxr-xr-x - hadoop supergroup 0 2018-06-05 07:15 /user/hive/warehouse/jimdb.db/dept
drwxr-xr-x - hadoop supergroup 0 2018-06-06 08:10 /user/hive/warehouse/jimdb.db/dual
drwxr-xr-x - hadoop supergroup 0 2018-06-10 21:01 /user/hive/warehouse/jimdb.db/emp_test
drwxr-xr-x - hadoop supergroup 0 2018-06-07 15:58 /user/hive/warehouse/jimdb.db/employees
drwxr-xr-x - hadoop supergroup 0 2018-06-02 05:56 /user/hive/warehouse/jimdb.db/employees_external_table
drwxr-xr-x - hadoop supergroup 0 2018-06-12 02:35 /user/hive/warehouse/jimdb.db/family
drwxr-xr-x - hadoop supergroup 0 2018-06-07 23:51 /user/hive/warehouse/jimdb.db/test1
drwxr-xr-x - hadoop supergroup 0 2018-06-10 19:26 /user/hive/warehouse/jimdb.db/udtf_test

从在数据库jimdb目录下查看的结果看,表目录以及数据文件已经完全删除掉了,所以对于管理表,能够有效的控制数据的生命周期,管理表和管理分区表在数据仓库中是应用最多的表类型。

2. 外部表举例

hive (jimdb)> --外部表
> CREATE EXTERNAL TABLE IF NOT EXISTS department(
> deptno STRING,
> dname STRING,
> loc STRING
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> LOCATION '/data/dept';
OK
Time taken: 0.318 seconds

外部表指向的这个目录下的数据文件内容如下:

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/dept/dept
50 HR XIAN
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

现在对该表进行查询:

hive (jimdb)> SELECT * FROM department;;
OK
department.deptno department.dname department.loc
50 HR XIAN
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
Time taken: 0.163 seconds, Fetched: 5 row(s)

可以通过DESC(RIBE) EXTENDED  tablename对外部表的详细信息进行查看:

hive (jimdb)> DESC EXTENDED department;
OK
col_name data_type comment
deptno string 
dname string 
loc string

Detailed Table Information Table(tableName:department, dbName:jimdb, owner:hadoop, createTime:1528811524, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:deptno, type:string, comment:null), FieldSchema(name:dname, type:string, comment:null), FieldSchema(name:loc, type:string, comment:null)], location:hdfs://192.168.178.134:9000/data/dept, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{field.delim= , serialization.format=
Time taken: 0.167 seconds, Fetched: 5 row(s)

外部表的查询和管理表时没有任何区别的,但是在删除表后,数据文件是不会被删除掉的,如下:

hive (jimdb)> drop table department;
OK
Time taken: 0.262 seconds

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/dept/dept
50 HR XIAN
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

外部表已经删除,但是数据文件没有受到影响。

3. 外部分区表

外部表也可以使用分区。在定义外部表时,必须定义一个LOCATION子句的数据文件目录,而对于外部分区表,不需要定义这个LOCATION子句,有一个ALTER TABLE XX ADD PARTITION ....LOCATION....语句在添加分区时定义这个分区的数据文件的目录。

创建一张某班级月考的学生成绩表

hive (jimdb)> CREATE EXTERNAL TABLE IF NOT EXISTS month_grade(
> stu_no INT,
> name STRING,
> grade_sum STRING)
> PARTITIONED BY(year INT,month INT)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
OK
Time taken: 0.371 seconds

hive (jimdb)> ALTER TABLE month_grade ADD PARTITION(year=2018,month=1)
> LOCATION 'hdfs://192.168.178.134:9000/data/2018/1';
OK
Time taken: 0.972 seconds
hive (jimdb)> ALTER TABLE month_grade ADD PARTITION(year=2018,month=2)
> LOCATION 'hdfs://192.168.178.134:9000/data/2018/2';
OK
Time taken: 0.32 seconds
hive (jimdb)> 
> ALTER TABLE month_grade ADD PARTITION(year=2018,month=3)
> LOCATION 'hdfs://192.168.178.134:9000/data/2018/3';
OK
Time taken: 0.289 seconds
hive (jimdb)> 
> ALTER TABLE month_grade ADD PARTITION(year=2018,month=4)
> LOCATION 'hdfs://192.168.178.134:9000/data/2018/4';
OK
Time taken: 0.195 seconds

可以删除掉分区,但是分区对应的数据不受影响,因为这是外部表的一个分区指向到了数据的路径。

hive (jimdb)> ALTER TABLE month_grade DROP PARTITION(year=2018,month=4);
OK
Time taken: 0.256 seconds

查看该分区对应的数据文件:

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -cat /data/2018/4/month_grade4
1000 liuhua 546
1001 dongqign 600
1002 tangtang 549
1003 qigngua 499
1004 liuhua 700
1005 liudongdong 609

数据文件还存在,因此说明外部表的分区的删除对数据文件没影响。

要删除数据文件,可以使用 hadoop fs  -rm -r  /data/2018/4 将这个目录下的文件都删除掉;

hadoop@192-168-178-134:/usr/local/hive/hive-1.2.2/bin$ hadoop fs -rmr /data/2018/4/
rmr: DEPRECATED: Please use '-rm -r' instead.
Deleted /data/2018/4

Hive管理表,外部表及外部分区表的深入探讨的更多相关文章

  1. 分区表,桶表,外部表,以及hive一些命令行小工具

    hive中的表与hdfs中的文件通过metastore关联起来的.Hive的数据模型:内部表,分区表,外部表,桶表受控表(managed table):包括内部表,分区表,桶表 内部表: 我们删除表的 ...

  2. 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据

    Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件.根据数据的不同存储方式,将Hive表分为外部表.内部表.分区表和分桶表四种数据模型.每种数据模型各有 ...

  3. 第2节 hive基本操作:9、hive当中创建外部表的语法及外部表的操作&分区表的语法和操作

    外部表: 外部表说明: 外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs当中,不会删掉 管理表和外部 ...

  4. hive 四种表,分区表,内部,外部表,桶表

    Hive四大表类型内部表.外部表.分区表和桶表 一.概述 总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表.分别对应不同的需求.下面主要讲解各种表的适用情形.创建和加载数据方法. 二.具 ...

  5. HIVE外部表 分区表

    HIVE外部表 分区表    外部表        创建hive表,经过检查发现TBLS表中,hive表的类型为MANAGED_TABLE. 在真实开发中,很可能在hdfs中已经有了数据,希望通过hi ...

  6. hive内部表、外部表、分区表、视图

    1.Table 内部表 1).与数据库中的Table在概念上是类似的 2).每一个Table在Hive中都有一个相应的目录存储数据 3).所有的Table数据(不包括 External Table) ...

  7. Hive 外部表 分区表

      之前主要研究oracle与mysql,认为hive事实上就是一种数据仓库的框架,也没有太多另类,所以主要精力都在研究hadoop.hbase,sqoop,mahout,近期略微用心看了下hive. ...

  8. Hive内部表,外部表和分区表

    外部表和内部表的区别 内部表也称之为managed_table: 默认存储在/user/hive/warehouse下,也可以通过location指定: 删除表事,会删除表数据以及元数据: 外部表称之 ...

  9. 大数据学习day26----hive01----1hive的简介 2 hive的安装(hive的两种连接方式,后台启动,标准输出,错误输出)3. 数据库的基本操作 4. 建表(内部表和外部表的创建以及应用场景,数据导入,学生、分数sql练习)5.分区表 6加载数据的方式

    1. hive的简介(具体见文档) Hive是分析处理结构化数据的工具   本质:将hive sql转化成MapReduce程序或者spark程序 Hive处理的数据一般存储在HDFS上,其分析数据底 ...

随机推荐

  1. Asp.net 项目部署的两个问题

    1:关于MVC中BundleCollection压缩js css文件 发布后获取失败的问题 原因是: 默认本地vs里面调试的时候,因为web.config文件里面有一个debug属性,当有此属性时,默 ...

  2. EOCS 最低资源保障机制

    本期小E将为大家带来EOCS 最低资源保障机制. 为满足普通用户日常的转账等基本需求,无需再为较少的初始资源抵押担心无法使用链上功能.EOCS可以通过链的参数来调整分配给每个用户免费的资源额度,相当于 ...

  3. Maven - 本地仓库(.m2) vs. 远程仓库(联网)

    转载自:https://www.cnblogs.com/shuaiandjun/p/7604619.html 什么是Maven仓库在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下, ...

  4. mysql 经纬度求距离

    SELECT id,lng,lat,ROUND(6378.138*2*ASIN(SQRT(POW(SIN((lat1*PI()/180-lat*PI()/180)/2),2)+COS(lat1*PI( ...

  5. LeetCode 13. Roman to Integer(c语言版)

    题意: Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value ...

  6. 关于mvc中传递匿名对象,view中无法解析

    最近做项目用到MVC,发现用linq查询得到的数据是匿名类型对象,通过模型绑定.或者ViewBag.ViewData进行数据传递后,View解析报错:“object 未包含xx的定义”: 没找到好的解 ...

  7. 算法工程师<机器学习基础>

    <机器学习基础> 逻辑回归,SVM,决策树 1.逻辑回归和SVM的区别是什么?各适用于解决什么问题? https://www.zhihu.com/question/24904422 2.L ...

  8. element-ui对话框组件Dialog在回调事件opened获取组件滚动条scrollTop的问题

    今天使用element中的Dialog组件时发现一个问题:当Dialog内容过多时会出现滚动条,而当你滚动到一定位置后关闭Dialog,然后再次打开时滚动条仍然保持在上一次关闭前的位置而没有回到顶部. ...

  9. 字符串string的相关应用

    之所以抛弃char* 的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等, 而且作为一个泛型类出现,他集成的操作函数足以完成我们大多数情况下 ...

  10. 集腋成裘-13-git使用-02进阶篇

    上一篇我们简单介绍了如何安装和使用git,本次将简单介绍如何创建分支.处理冲突.提交与回滚 创建和合并分支是Git的一大特色. 使用场景:当有一个新功能要开发,但是又没有确定上线时间,不能合并到主干上 ...