[关闭]
@zhangyy 2018-12-17T15:42:05.000000Z 字数 3692 阅读 202

hive 表的基本操作

hive的部分


  • 使用load 方式加载数据到Hive 表中,注意分区表加载数据的特殊性
  • 如何保存HiveQL 查询结果:保存到表中,保存到本地文件(注意指定列分隔符)
  • 常见查询练习,如group by、having、join、sort by、order by 等。

一:hive 表的操作

### 1.1.1 hive的库的创建与数据库的查看:

  1. hive(default)> create database yangyang;

1.png-3.7kB

  1. hive(default)> use yangyang;
  2. hive(yangyang)>desc database yangyang;

2.png-12kB

1.1.2 hive 表的创建查看与数据导入

创建emp 表:

  1. hive(yangyang)> create table emp(
  2. empno int,
  3. ename string,
  4. job string,
  5. mgr int,
  6. hiredate string,
  7. sal double,
  8. comm double,
  9. deptno int
  10. )
  11. row format delimited fields terminated by '\t';

3.png-13.1kB

1.1.3 hive 创建表的三种方式:

1. 直接在数据库中创建:

  1. hive(yangyang)>create table dept(
  2. deptno int,
  3. dname string,
  4. loc string
  5. )
  6. row format delimited fields terminated by '\t';

4.png-8.2kB

2.使用已经存在的数据库进行数据抽取从新生成一张表:

  1. create table emp2 as select * from emp;
  2. 1.此方法抽取的表数据与表结构都会存在
  3. 2.创建表的时候会执行mapreduce 的后端程序

10.png-41.3kB

3.创建一张空表带数据结构

  1. create table emp3 like emp;
  2. select * from emp3;

11.png-4.2kB

12.png-6kB

1.1.4 hive 数据的导入处理:

1. 正常空表导入:

  1. load data local inpath "/home/hadoop/emp.txt" into table emp;
  2. load data local inpath "/home/hadoop/dept.txt" into table dept;

5.png-14.4kB

2. 从hdfs 中导入数据

  1. 指定 hdfs 目录进行数据导入:
  2. load data inpath "/user/hive/warehouse/yangyang.db/emp/emp.txt" into table emp3;

13.png-25.1kB

3. 加载数据进行数据覆盖:

  1. hdfs dfs -put emp.txt /user
  2. load data inpath "/user/emp.txt" overwrite into table emp;

14.png-25.8kB

  1. 注释:hive 在导入数据的时候不是空表的时候默认是追加导入append
  2. 一般在导入重复数据的时会增加overwrite 进行数据覆盖。

4.创建表的时候用select完成

  1. create table emp5 as select * from emp;

15.png-36.4kB

5.创建数据用insert into 创建表

  1. 先创建一个空表:
  2. create table emp4 like emp ;
  3. 然后插入数据:
  4. insert into table emp4 select * from emp;

16.png-23.7kB

1.1.5hive库的导出:

1.导出到本地系统:

  1. insert overwrite local directory '/home/hadoop/exp'
  2. row format delimited fields terminated by '\t' select * from emp ;

1.png-29.8kB

2. 导出到hdfs文件系统上面:

  1. insert overwrite directory '/emp.txt' select * from emp ;

2.png-33.5kB

3. 导出文本文件:

  1. hive -e 'select * from yangyang.emp' >> 1.txt

3.png-24.3kB

4.采用sqoop 数据导入导出。

hive 表的查看方式:
  1. select * from dept
  2. select * from emp;

6.png-34.2kB
7.png-10.4kB

  1. desc formatted dept;
  2. desc formatted emp;

8.png-18.3kB

查询前几个字段:
  1. select emp.ename from emp limit 2;

4.png-24.1kB

去重复查询:
  1. select distinct(deptno) from emp limit 2;

5.png-30.2kB

输出结果进行排序:
  1. select * from emp order by empno;

6.png-33.1kB

统计行数:
  1. select count(empno) from emp;

7.png-32.2kB

除去重复统计:
  1. select count(distinct deptno) from emp;

8.png-32.5kB

分组统计:
  1. select deptno,count(ename) from emp group by deptno ;

9.png-34.8kB

分组统计求最大值:
  1. select deptno,max(sal) from emp group by deptno ;

9.png-34.8kB

分组之后过了统计:
  1. select deptno,count(ename) from emp group by deptno having count(ename)>3;

10.png-34.7kB

设置mapreduce的个数。
  1. hive >set mapreduce.job.reduces=3;
  2. hive > insert overwrite local directory '/home/hadoop/exp1'
  3. row format delimited fields terminated by '\t' select * from emp sort by empno;

image_1aj416spl1q81vfhivs1l14mmc4d.png-3.6kB
image_1aj41jbokkg3f641im71ol6hcb4q.png-67.6kB

1.1.6 关于hive 的排序功能:

  1. order by
  2. --全局排序 asc desc
  3. sort by
  4. --局部排序,每个reduce进行排序,全局不排序
  5. distribute by
  6. --类似与分区partition,通常和sort by联合使用
  7. --通常sort by放在distribute by之后
  8. cluster by
  9. --相当于distribute bysort by的结合(分区和排序字段一样)
  1. insert overwrite local directory '/home/hadoop/exp2'
  2. row format delimited fields terminated by '\t' select * from emp
  3. distribute by deptno sort by empno;

image_1aj41qlcttus58a1pq512es1qkm57.png-68.3kB

hive 的join 查询

右连接
  1. select dept.dname,emp.ename from dept right join emp on emp.deptno=dept.deptno ;

image_1aj4281d9ddu72q1mbktgi1ose5k.png-28.8kB

左连接
  1. select dept.dname,emp.ename from emp left join dept on emp.deptno=dept.deptno ;

image_1aj42c5tm1tohgal153u16ka14kk61.png-28.8kB

查询是否要走mapreduce 程序:
  1. <property>
  2. <name>hive.fetch.task.conversion</name>
  3. <value>more</value> <!-- minimal 改成more 更多的命令不走map人deuce-->
  4. <description>
  5. Some select queries can be converted to single FETCH task minimizing latency.
  6. Currently the query should be single sourced not having any subquery and should not have
  7. any aggregations or distincts (which incurs RS), lateral views and joins.
  8. 1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
  9. 2. more : SELECT, FILTER, LIMIT only (TABLESAMPLE, virtual columns)
  10. </description>
  11. </property>
  1. select emp.empno,emp.ename from emp;

image_1aj43kb3g13rv12t31vvhj361vht9.png-26kB

  1. select count(empno) from emp;

image_1aj43n5hn5l712gh1vs8q6p1acam.png-12.5kB

explain 查看hive命令的更多的解析状态:
  1. explain select count(empno) from emp;

image_1aj43t4oo1kpa16871p8p1dq41n5c13.png-21.5kB
image_1aj43u63d1vr7bgi2i11qlu3b1g.png-44.8kB
image_1aj43uscj1q7b18t6eumpnp1av11t.png-13.6kB

hive 查询中的四个查询
  1. order by 分组查询 (全局数据的排序/只有一个reduce 输出)
  2. select * from emp order by empno desc

image_1b847cfr7rba12275ks114616ub9.png-385.3kB
image_1b847dg4e13bj1gjl1uct1ar31uplm.png-526.5kB

  1. sort by 对每个reduce 的内部进行排序 对全局结果来说 是没有排序的
  2. 设置hive中的mapreduce 的数目
  3. set mapreduce.job.reduces=3
  4. select * from emp sort by empno asc

image_1b848457m1101ds9kvviju13a013.png-441.9kB

image_1b8484slj1pthlfa9i91hre5hp1g.png-504.7kB

  1. distribute by
  2. 分区partition
  3. 类似于MapReduce中分区partition,对数据进行分区,结合sort by进行使用
  4. insert overwrite local directory '/root/emp.txt' select * from emp distribute by deptno sort by empno asc ;
  5. 注意事项:
  6. distribute by 必须要在sort by 前面。

image_1b85sqkgi1df31f6o1ba7m731ed39.png-579.6kB


  1. >> cluster by
  2. distribute bysort by 字段相同时,可以使用cluster by ;
  3. insert overwrite local directory '/root/emp.txt' select * from emp cluster by empno ;

image_1b85u7juj1nl9mto1tihn3n1275m.png-568.5kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注