一、数据定义(DDL)
创建修改和删除数据库、表、视图、函数和索引
1.1 创建、修改和删除数据库
1 | create database if not exists hive; #创建数据库 |
1.2 创建、修改和删除表
1 | #创建内部表(管理表) |
1.3 视图和索引的创建、修改和删除
1 | #创建视图 |
1.4 用户自定义函数
1 | #显示hive中的内置函数 |
二、数据操作(DML)
2.1 向表中装载数据
创建两个表 stu 和 course,terminated by '\t'
表示根据每行数据的'\t'
制表符来区分字段的
1 | create table if not exists stu(id int,name string) row format delimited fields terminated by '\t'; |
2.1.1 从文件中导入
1 | $ cat /tmp/stu.txt |
2.1.2 通过查询语句插入
1 | #创建表并通过查询写入数据 |
2.2 从表中导出数据
通过 hadoop fs 拷贝
1 | hadoop fs -cp source_path target_path; |
查询写入本地文件
1 | insert overwrite local directory '/tmp/stu' select id,name from stu; |
Hive Shell 命令导出
1 | hive -e 'select * from default.student;' > /tmp/student.txt; |
Expor 导出到 HDFS 上
1 | export table default.student to '/user/hive/warehouse/export/student'; |
Sqoop 导出 ,从Hive导出到MySQL
1 | sqoop export |
2.3 数据备份与恢复
备份
1 | #把src_commit表中的数据以'|'为分隔符号,并备份到"/backup/src_commit" |
恢复
1 | #创建表 |
2.4 更新和删除数据
更新和删除的语法比较简单,和关系型数据库一致。需要注意的是这两个操作都只能在支持 ACID 的表,也就是事务表上才能执行。
更新
UPDATE table_name SET column = value [, column = value …] [WHERE expression]删除
DELETE FROM table_name [WHERE expression]
2.4.1 修改配Hive置
修改 hive-site.xml
,添加如下配置,开启事务支持,配置完成后需要重启 Hive 服务
1 | <property> |
2.4.2 测试更新和删除
创建用于测试的事务表,建表时候指定属性 transactional = true
则代表该表是事务表。需要注意的是,按照官方文档 的说明,目前 Hive 中的事务表有以下限制:
- 必须是 buckets Table;
- 仅支持 ORC 文件格式;
- 不支持 LOAD DATA …语句。
1 | #创建测试表 |
2.4.3 清空表数据
1 | #删除表数据和结构可以使用drop |
2.5 Merge 合并
语法如下
1 | Standard Syntax: |
2.5.1 建表
1 | CREATE DATABASE merge_data; |
2.5.2 导入数据
1 | INSERT INTO merge_data.merge_source VALUES |
2.5.3 Merge 操作
1 | #需要修改配置 |
三、数据查询(DQL)
Hive 查询语句是 SELECT 语句,语法如下
1 | SELECT [ALL | DISTINCT] select_expr, select_expr, ... |
3.1 Where 条件
类似我们传统SQL的where 条件,目前支持 AND
, OR
,0.9版本支持between IN
, NOT IN
不支持EXIST
, NOT EXIST
ORDER BY
与 SORT BY
的不同: ORDER BY
全局排序,只有一个Reduce任务 SORT BY
只在本机做排序
1 | select * from emp where deptid=31; |
3.2 基于分区查询
当指定表有分区定义(即 PARTITIONED BY 子句),查询可以在指定的分区范围内进行,否则会扫描整个表;此外,要想让分区内查询,必须在 WHERE 或 JOIN … ON … 子句上明确指定分区字段信息。
假设表的分区信息是日期字段 dt,那分区查询如下
1 | SELECT * FROM t1 |
如果表 t1 和 t2 通过 JOIN 关联时,若要分区起作用,需要在 ON 上指定分区信息
1 | SELECT t1.* |
3.3 GROUP BY 分组统计
Hive 提供 GROUP BY 子句做聚合操作
1 | SELECT col1 FROM t1 GROUP BY col1 |
3.4 Having 过滤分组统计结果
聚合语句 GROUP BY 常和 HAVING 子句结合使用,用于指定聚合条件。
Hive 在 0.7.0 版本开始支持 HAVING,之前老版本需要通过其它 SELECT 子句才能做到
1 | SELECT col1 FROM t1 GROUP BY col1 HAVING SUM(col2) > 10 |
等同于
1 | SELECT col1 FROM (SELECT col1, SUM(col2) AS col2sum FROM t1 GROUP BY col1) t2 WHERE t2.col2sum > 10 |
3.5 Limit 限制返回记录数量
Limit 可以限制查询的记录数,例如,返回前 5 条记录
1 | SELECT * FROM t1 LIMIT 5 |
实现Top k 查询
下面的查询语句查询销售记录最大的 5 个销售代表
1 | SET mapred.reduce.tasks = 1 |
正则表达式规范
SELECT 语句可以使用正则表达式做列选择,前提是需要设置set hive.support.quoted.identifiers=none;
,下面的语句查询除了 ds 和 hr 之外的所有列
1 | SELECT `(ds|hr)?+.+` FROM test |
3.6 统计函数
与SQL一样,可以使用count( )函数统计记录条数,对数值型字段,可以用max( )函数求最大值,用min( )函数求最小值,用sum( )函数求和,用avg( )函数求平均值。使用这些函数,都会触发MapReduce操作。
1 | SELECT count(*),max(degree),min(degree),avg(degree),sum(degree) FROM emp; |
3.7 distinct 去除重复值
1 | select distinct(deptid) from emp; |
3.8 like 模糊查询
like如同SQL语句,可以对字符型字段进行模糊查询
1 | select * from emp where ename like '%o%'; |
3.9 having 过滤分组统计结果
1 | select deptid,avg(degree) from emp group by deptid having avg(degree)>3; |
3.10 inner join 内联接
1 | select e.*,d.* from emp e inner join dept d on e.deptid=d.deptid; |
3.11 left outer join和right outer join外联接
left outer join表示左外联接,right outer join表示右外联接
1 | #left outer join显示左表全部数据。如果右表没有数据与之对应,则显示NULL |
3.12 full outer join 外部联接
full outer join表示完全外部联接
1 | select e.*,d.* from emp e full outer join dept d on e.deptid=d.deptid; |
3.13 order by 排序
order by后面指明排序字段,默认是按asc升序排序,也可用desc指示降序排序。
1 | select * from emp order by deptid; |
更多操作请参考:Hive语言手册