基于 MySql 的远程模式安装的 Hive 中的表存储在 hdfs 的 /user/hive/warehouse
目录下。
hive 的表主要有 5 中类型:
表对应一个目录,表中的数据对应一个文件
文件存储在 hdfs 的 Datanode 的数据块中,数据块默认的大小是 128m(Hadoop2.x的版本,1.x版本是 64m)
表的元信息(表名,列名,列的类型)存储在 mysql 数据库的表中(TBLS -> 表信息,COLUMNS_V2 -> 列信息)
例:创建 emp 表,字段如下,数据文件列分隔符为 ","
create table emp
(empno int, ename string, job string, mgr int,
hiredate string, sal int, comm int, deptno int)
row fromat delimited fields terminated by ',';
# 导入HDFS的数据,/ 是HDFS的根
load data inpath '/data/emp.csv' into table emp;
# 导入本地Linux数据,/ 是Linux的根
load data local inpath '/root/data/emp.csv' into table emp;
emp.csv 文件内容:
7369,SMITH,CLERK,7902,1980/12/17,800,,20
7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30
7521,WARD,SALESMAN,7698,1981/2/22,1250,500,30
7566,JONES,MANAGER,7839,1981/4/2,2975,,20
7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30
7698,BLAKE,MANAGER,7839,1981/5/1,2850,,30
7782,CLARK,MANAGER,7839,1981/6/9,2450,,10
7788,SCOTT,ANALYST,7566,1987/4/19,3000,,20
7839,KING,PRESIDENT,,1981/11/17,5000,,10
7844,TURNER,SALESMAN,7698,1981/9/8,1500,0,30
7876,ADAMS,CLERK,7788,1987/5/23,1100,,20
7900,JAMES,CLERK,7698,1981/12/3,950,,30
7902,FORD,ANALYST,7566,1981/12/3,3000,,20
7934,MILLER,CLERK,7782,1982/1/23,1300,,10
注意:导入数据其实是 Ctrl + x 操作,在实际应用中,数据文件一般几十G,非常消耗服务器性能,所以一般在实际开发中使用外部表,只建立与外部数据之间的联系。
表对应一个目录,分区也对应一个目录,分区中的数据对应文件
分区表可以提高查询效率
例:创建 emp_part 表,字段如下(表的字段没有 deptno),数据文件列分隔符为 ","
create table emp_part
(empno int, ename string, job string, mgr int,
hiredate string, sal int, comm int)
partitioned by (deptno int)
row fromat delimited fields terminated by ',';
向分区表中插入数据:
insert into table emp_part partition(deptno=10)
select empno, ename, job, mgr, hiredate, sal, comm from emp where deptno = 10;
insert into table emp_part partition(deptno=20)
select empno, ename, job, mgr, hiredate, sal, comm from emp where deptno = 20;
指向已经存在与 HDFS 中的数据
创建过程:加载数据和创建表同时完成,不会移动数据文件到 /user/hive/warehouse 目录下,创建了外部表后 /use/hive/warehouse 目录下根本不会生成表名所对应的目录
删除外部表时,仅把在 MySql 中存储的该外部表的元信息给删除了
例:创建 ex_student 表,字段如下,数据文件存储在 HDFS 的 /students 目录下
create external table ex_student
(sid int, sname string, age int)
row format delimited fields terminated by ','
location '/students';
HDFS 的 /students 目录下的文件的内容如下:
1,MrQuJL,22
2,zhangsan,30
3,wangwu,70
4,lisi,80
表对应目录,桶对应文件
桶表是对存入的数据按照某个字段进行哈希取值,值相同的放到同一个文件存储
创建 emp_bucket 表,字段如下,按照 job 字段分成四个桶
create table emp_bucket
(empno int, ename string, job string, mgr int, hiredate string,
sal int, comm int, deptno int)
clustered by (job) into 4 buckets
row format delimited fields terminated by ',';
通过查询插入数据:
insert into emp_bucket select * from emp;