select用于映射符合指定查询条件的行
Hive select是数据库标椎SQL的子集
select * from table_name;
select * from table_name where name='zs';
hive中select * from
涉及计算 统计 需要给键启动MapReduce;不是映射,拿到是一键一值
cte 语法
with t1 as (select ....) select * from t1
实例
with
t1 as (select order_customer from orders group by order_customer_id)
select c.customer_id,concat(customer_fname,'.',customer_lname) as name
from t1 inner join customers c on t.order_customer_id = c.customer_id
嵌套查询
select * from (select * from employee) a;
列匹配正则表达式
SET hive.support.quoted.identifiers = none;开启
SELECT `^o.*` FROM offers;
指对多表进行联合查询,join用于将二个或多个表中的行组合在一起查询类似于SQL join,但是Hive仅支持等值连接
内连接:inner join;
外连接:outer join;
right join:右连接查询就是显示左表中的数据,在左表中午匹配则返回NULL值。
SELECT e.ename,f.area FROM emp e
RIGHT OUTER JOIN empfrom f
ON e.eid=f.eid;
left join:左连接查询就是显示左表中的数据,在右表中午匹配则返回NULL值。
SELECT e.ename,f.area FROM emp e
LEFT OUTER JOIN empfrom f
ON e.eid=f.eid;
full outer join:FULL OUTER JOIN的结果集是LEFT 、RIGHT结果的并集。
SELECT e.ename,f.area FROM emp e
FULL OUTER JOIN empfrom f
ON e.eid=f.eid;
Mapjoin 操作在Map端完成
小表关联大表,注意这里小表在前,大表在后,将小表放在前面可自动将小表拉进内存里,这里的小表不超过10m(大约一万条数据)。
开启join操作:
set hive.auto.convert.join = true
运行时自动将连接转换为Mapjoin;
当然Map join 不支持:
在UNION ALL, LATERAL VIEW, GROUP BY/JOIN/SORT BY/CLUSTER BY/DISTRIBUTE BY等操作后面
在UNION, JOIN 以及其他 MAPJOIN之前
所有子集数据必须具有相同的名称和类型
UNION ALL:合并后保留重复项
UNION:合并后删除重复项(v1.2之后)
可以在顶层查询中使用(0.13.0之后)
ORDER BY, SORT BY, CLUSTER BY, DISTRIBUTE BY 和LIMIT适用于合并后的整个结果
集合其他操作可以使用JOIN/OUTER JOIN来实现
差集、交集
load用于在hive中移动数据
LOAD DATA LOCAL INPATH '/home/dayongd/Downloads/employee.txt'
OVERWRITE INTO TABLE employee;
-- LOCAL表示文件位于本地,OVERWRITE表示覆盖现有数据
LOAD DATA LOCAL INPATH '/home/dayongd/Downloads/employee.txt'
OVERWRITE INTO TABLE employee_partitioned PARTITION (year=2014, month=12);
-- 没有LOCAL,文件位于HDFS文件系统中
LOAD DATA INPATH '/tmp/employee.txt'
OVERWRITE INTO TABLE employee_partitioned PARTITION (year=2017, month=12);
使用INSERT语句将数据插入表/分区
-- INSERT支持OVERWRITE(覆盖)和INTO(追加)
INSERT OVERWRITE/INTO TABLE tablename1
[PARTITION (partcol1=val1, partcol2=val2 ...)]
select fileds,... from tb_other;
Hive支持从同一个表进行多次插入
INSERT INTO中TABLE关键字是可选的
INSERT INTO可以指定插入到哪些字段中
如:INSERT INTO t(x,y,z)
INSERT INTO table_name VALUES,支持插入值列表
数据插入必须与指定列数相同
INSERT OVERWRITE TABLE test select 'hello'; -- INSERT不支持的写法
insert into employee select * from ctas_employee; -- 通过查询语句插入
-- 多插入
from ctas_employee
insert overwrite table employee select *
insert overwrite table employee_internal select *;
-- 插入到分区
from ctas_patitioned
insert overwrite table employee PARTITION (year, month)
select *,'2018','09';
-- 通过指定列插入(insert into可以省略table关键字)
insert into employee(name) select 'John' from test limit 1;
-- 通过指定值插入
insert into employee(name) value('Judy'),('John');
文件插入只支持OVERWRITE
支持来自同一个数据源/表的多次插入
LOCAL:写入本地文件系统
默认数据以TEXT格式写入,列由^A分隔
支持自定义分隔符导出文件为不同格式,CSV,JSON等
-- 从同一数据源插入本地文件,hdfs文件,表
from ctas_employee
insert overwrite local directory '/tmp/out1' select *
insert overwrite directory '/tmp/out1' select *
insert overwrite table employee_internal select *;
-- 以指定格式插入数据
insert overwrite directory '/tmp/out3'
row format delimited fields terminated by ','
select * from ctas_employee;
-- 其他方式从表获取文件
hdfs dfs -getmerge <table_file_path>
IMPORT和EXPORT用于数据导入和导出
常用于数据迁移场景
除数据库,可导入导出所有数据和元数据
使用EXPORT导出数据
EXPORT TABLE employee TO '/tmp/output3';
EXPORT TABLE employee_partitioned partition (year=2014, month=11) TO '/tmp/output5';
使用IMPORT导入数据
IMPORT TABLE employee FROM '/tmp/output3';
IMPORT TABLE employee_partitioned partition (year=2014, month=11) FROM '/tmp/output5';
只使用一个reduce执行全局数据排序,速度慢,应提前做好数据过滤,支持使用 case when或表达式,支持按位置编号排序
set hive.groupby.orderby.position.alias=true;
select * from offers order by case when offerid = 1 then 1 else 0 end;
select * from offers order by 1;
sort by 对每一个reduce中的数据进行排序
当reduce数量设置为1时,等于order by,拍寻列必须出现select column中
设置reduce数量:set mapred.reduce.tasks=2;
hive中select * from
涉及计算 统计 需要给键启动MapReduce;不是映射,拿到是一键一值
distribute by:确保具有匹配列值的行被分区到相同的Reducer,能够在每一个分区进行排序,但在全局不能保证排序
distribute by 一般和sort by 一起用
解释:select * from mynulltabnle distribute by mntid sort by mnname;
先以mntid进行hash,在mnname进行排序
cluster by=distribute by+sort by :不支持排序,sort by 不管数据拉取,cluster by 考虑数据拉取,排序条件正好跟数据拉取条件一样