您的位置:首页 > 其它

Hive之管理表 外部表 分区表

2016-10-29 18:36 260 查看

一Hive 创建表的三种方式

1.1普通创建



1.2查询语句创建

CREATETABLE IF NOT EXISTS ext_1 AS SELECT deptno,dname,loc FROMdept;



1.3like创建

CREATETABLE IF NOT EXISTS ext_like like emp;



二 内部表与外部表的比较

Hive表概念和关系型数据库表概念差不多。在Hive里表会和HDFS的一个目录相对应,这个目录会存放表的数据。目录默认是/usr/

hive/warehouse/.比如你在hadoop09数据库创建了emp表,那么HDFS

/user/hive/warehouse/hadoop09.db/emp就会有这个目录来存放表里的数据。

管理表:管理表又被称之为内部表,他只管理着数据生命周期,当我们删除这张表时,元数据和真是存储的数据都会被删除,也就是说HDFS所对应的表目录应该被删除。

管理表有一个缺点:就是不方便和其他工作共享数据。

 

现在有几个问题:

1多个人同时在使用这张表,然后某个人不小心,把表删掉了,其他人都用不了了。

2其他工具产生的数据在某个HDFS某个目录,但是Hive想去查询这些数据,但是并没有给Hive数据所有权。

因此,hive里就提供了如果数据被多个工具共享,我们可以创建外部表

外部表:删除该表时,只会删除元数据信息,但是不会删除真正的数据。也就是说外部表数据并不是由他自己管理的。

CREATEEXTERNAL TABLE dept_external(

    deptno int,

    dname string,

    loc string

)

ROWFORMAT DELIMITED FIELDS TERMINATED BY '\t'

LOCATION'/user/hive/warehouse/hadoop09.db/dept';

LOCATION:告诉Hive数据位于什么路径



 

三 分区表作用以及如何创建,更改

一般情况下,Hive 一个简单的查询会扫描整张表,对一张大表而言,会降低性能,我们可以使用分区来解决,他也是类似于关系型数据库表的分区。

在Hive里分区都适合预定义的列相关的,作为子目录存在于在表的目录里。当表查询时,WHERE子句里的谓词就是分去过滤器,然后只查询相关的分区的数据返回,而不是查询整个表。

首先,我们创建一个分区表:



然后添加分区

ALTERTABLE emp_partition ADD IF NOT EXISTS PARTITION (country='America',state='CA');

ALTERTABLE emp_partition ADD IF NOT EXISTS PARTITION (country='Canada',state='MH');

这时候,HDFS就会新增这样的2个目录

/user/hive/warehouse/hadoop09.db/emp_partition/country=America/state=CA
http://hadoop09-/user/hive/warehouse/hadoop09.db/emp_partition/country=Canada/state=MH
我们也可以指定partition在不在表这个目录里。

ALTERTABLE emp_partition ADD IF NOT EXISTS PARTITION (country='China',state='BJ')LOCATION '/locate/partition';

我么这时候查询分区情况:

showpartitions emp_partition;

 


四 如何向分区表加载数据

loaddata local inpath '/opt/software/hive/emp.txt' into table emp_partition

partition(country='America',state='CA'); 



loaddata local inpath '/opt/software/hive/emp.txt' into table emp_partition

partition(country='China',state='BJ'); 



然后我们去检查/locate/partition是否有数据呢?

有数据吧。



五 如何检索分区表数据

在添加分区之后,表里的字段会增加对应的虚拟字段,以供查询使用。

比如我们上面的例子,就会增加country和 state两个字段。

SELECT* FROM emp_partition WHERE country='China';

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: