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

最新文章

  1. word 常用宏代码
  2. NOIP2008普及组题解
  3. IRQ和FIQ中断的区别【转】
  4. Jackson - Date Handling
  5. javascript关闭浏览器窗口
  6. Pythoner | 你像从前一样的Python学习笔记
  7. python函数cmp()
  8. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
  9. Swiper 判断上滑下拉操作
  10. 用MVC导入导出
  11. SSM博客
  12. 在linux(centos)系统安装redis教程
  13. Analysis Services features supported by SQL Server editions
  14. windows安装虚拟机(VMware)
  15. 使用Bash Bunny从被锁定的系统抓取登陆凭据
  16. 解决Mac系统升级导致cocoapods失效问题
  17. sql语句中left join和inner join中的on与where的区别分析
  18. BSGS算法学习笔记
  19. 旅游吧!我在这里 ——旅游相册POI搜索:找回你的足迹
  20. Spring Boot 在接收上传文件时,文件过大异常处理问题

热门文章

  1. Exp1:PC平台逆向破解 20164314 郭浏聿
  2. python 中获取列表的索引
  3. 第十四节,OpenCV学习(三)图像的阈值分割
  4. git本机服务器配置(一):git的安装
  5. 洛谷P5284 [十二省联考2019]字符串问题 [后缀树]
  6. es6 总结知识点
  7. Nginx+IIS+asp.net mvc 实现负载均衡示例
  8. Jmeter组成结构及运行原理
  9. Runtime个别API的使用
  10. window 服务器 安装 sql server 2008 r2 express 并启用远程访问