数据表(Tables)
HIve的表在逻辑上由存储的数据和描述表中数据形式的相关元数据组成.数据一般存放在HDFS中,但它也可以放在其他任何Hadoop文件系统中,包括本地文件系统或S3.Hive把元数据存放在关系型数据库中,而不是放在HDFS中.
(1).内部表和外部表
-
内部表(managed table)
在Hive中创建表时,默认情况下Hive负责管理数据.这意味着Hive把数据移入它的"仓库目录"(warehouse directory).
加载操作就是文件系统中的文件移动或文件重命名,因此它的执行速度很快,但记住,即便是内部表,Hive也并不检查表目录中的文件是否符合为表所声明的模式.如果有数据和模式不匹配,只有在查询时才会知道,我们通常要通过查询为缺失字段返回的空值NULL才知道存在不匹配的行.可以发出一个简单的SELEXCT语句来查询表中的若干行数据,从而检查数据是否能够被正确解析
如果要丢弃一个表,可以使用:
drop table 表名;
这个表,包括它的元数据和数据,会被一起删除. -
外部表(external table)
外部表将数据保存在指定位置的HDFS路径中,由人为控制数据的创建和删除.
使用EXTERNAL关键字以后,Hive知道数据不由自己管理,因此不会把数据移到自己的仓库目录.事实上,在定义时,它甚至不会检查这一外部位置是否存在.而这意味着你可以把创建数据推迟到创建表之后才进行.
丢弃外部表时,Hive不会碰数据,而只会删除元数据. -
如何选择内部表和外部表
一个经验法则:如果所有的处理都有HIve完成,应该使用内部表.但如果要用Hive和其他工具来处理同一个数据集,应该使用外部表.普遍的用法是把存放在HDFS的初始数据集用作外部表进行使用,然后用Hive的变换功能把数据移到内部的Hive表.这一方法反之也成立,外部表可以用于从Hive导出数据供其他应用程序使用.
需要使用外部表的另一个原因是你想为同一个数据集关联不同的模式.
建表高阶语句
(1)CTAS-as select方式建表
create table cte_employee as select * from employee;
(2)CTAS(CTAS with Common Table Expression)
CREATE TABLE cte_employee AS WITH r1 AS (SELECT name FROM r2 WHERE name = 'Michael'), r2 AS (SELECT name FROM employee WHERE sex_age.sex= 'Male'), r3 AS (SELECT name FROM employee WHERE sex_age.sex= 'Female') SELECT * FROM r1 UNION ALL SELECT * FROM r3;
(3)like(复制表结构,不复制表数据)
CREATE TABLE employee_like LIKE employee;
创建临时表
临时表是应用程序自动管理在复杂查询期间生成的中间数据的方法
表只对当前session有效,session退出后自动删除
表空间位于/tmp/hive-<user_name>(安全考虑)
如果创建的临时表表名已存在,实际用的是临时表
表操作
(1)删除表
drop table if exists employee[With PERGE];
(With PERGE直接删除可选,否则会放到.Trash目录)
(2)修改表(alter针对元数据)
ALTER TABLE employee RENAME TO new_employee;
ALTER TABLE c_employee SET TBLPROPERTIES ('comment'='New name, comments');
ALTER TABLE employee_internal SET SERDEPROPERTIES ('field.delim' = '$’);
ALTER TABLE c_employee SET FILEFORMAT RCFILE;
– 修正表文件格式
– 修改表的列操作
ALTER TABLE employee_internal CHANGE old_name new_name STRING;
– 修改列名
ALTER TABLE c_employee ADD COLUMNS (work string);
– 添加列
ALTER TABLE c_employee REPLACE COLUMNS (name string);
– 替换列
Hive视图
视图是一种用select语句定义的虚表(virtual table).试图可以用来以一种不同于磁盘实际存储的形式把数据呈现给用户.现有表中的数据常常需要以一种特殊的方式简化和聚集以便于后期处理.视图也可以用来限制用户,使其只能访问被授权可以看到表的子集.
(1)视图概述
通过隐藏子查询、连接和函数来简化查询的逻辑结构
虚拟表,从真实表中选取数据
只保存定义,不存储数据
如果删除或更改基础表,则查询视图将失败
视图是只读的,不能插入或装载数据
(2)应用场景
将特定的列提供给用户,保护数据隐私
查询语句复杂的场景
(3)视图操作
视图操作命令:CREATE、SHOW、DROP、ALTER
CREATE VIEW view_name AS SELECT statement;
– 创建视图
– 创建视图支持 CTE, ORDER BY, LIMIT, JOIN, etc.
SHOW TABLES;
– 查找视图 (SHOW VIEWS 在 hive v2.2.0之后)
SHOW CREATE TABLE view_name;
– 查看视图定义
DROP view_name;
– 删除视图
ALTER VIEW view_name SET TBLPROPERTIES ('comment' = 'This is a view');
–更改视图属性
ALTER VIEW view_name AS SELECT statement;
– 更改视图定义
(4)侧视图(Lateral View)
- 常与表生成函数结合使用,将函数的输入和输出连接
- OUTER关键字:即使output为空也会生成结果
select name,work_place,loc from employee lateral view outer explode(split(null,',')) a as loc;
- 支持多层级
select name,wps,skill,score from employee lateral view explode(work_place) work_place_single as wps lateral view explode(skills_score) sks as skill,score;
- 通常用于规范行话或解析JSON