apache hadoop hive高级查询一

文章目录

  • Hive的数据查询
    • select基础
    • cte和嵌套查询
    • 进阶语句
  • Hive的数据关联
    • join 关联查询
  • Mapjoin
  • Hive集合操作 union
  • 装载数据:load 移动数据
    • insert表插入数据1
    • insert表插入数据2
  • hive数据插入文件
    • 使用insert语句将数据插入/导出到文件
  • hive数据交换 import/export
  • hive数据排序
    • order by
    • sort by
    • distribute by
    • cluster by

Hive的数据查询

select基础

select用于映射符合指定查询条件的行
Hive select是数据库标椎SQL的子集

select  * from table_name;
select * from table_name where name='zs';

hive中select * from
在这里插入图片描述
涉及计算 统计 需要给键启动MapReduce;不是映射,拿到是一键一值

cte和嵌套查询

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;	

Hive的数据关联

join 关联查询

指对多表进行联合查询,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;

apache hadoop hive高级查询一_第1张图片
left join:左连接查询就是显示左表中的数据,在右表中午匹配则返回NULL值。

SELECT e.ename,f.area FROM emp e
LEFT OUTER JOIN empfrom f
ON e.eid=f.eid;

apache hadoop hive高级查询一_第2张图片
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;

apache hadoop hive高级查询一_第3张图片

Mapjoin

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之前

Hive集合操作 union

所有子集数据必须具有相同的名称和类型
UNION ALL:合并后保留重复项
UNION:合并后删除重复项(v1.2之后)
可以在顶层查询中使用(0.13.0之后)
ORDER BY, SORT BY, CLUSTER BY, DISTRIBUTE BY 和LIMIT适用于合并后的整个结果
集合其他操作可以使用JOIN/OUTER JOIN来实现
差集、交集

装载数据:load 移动数据

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表插入数据1

使用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表插入数据2

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');

hive数据插入文件

使用insert语句将数据插入/导出到文件

文件插入只支持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>

hive数据交换 import/export

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';

hive数据排序

order by

只使用一个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

sort by 对每一个reduce中的数据进行排序
当reduce数量设置为1时,等于order by,拍寻列必须出现select column中

设置reduce数量:set mapred.reduce.tasks=2;

hive中select * from

在这里插入图片描述
涉及计算 统计 需要给键启动MapReduce;不是映射,拿到是一键一值

distribute by

distribute by:确保具有匹配列值的行被分区到相同的Reducer,能够在每一个分区进行排序,但在全局不能保证排序
distribute by 一般和sort by 一起用

解释:select * from mynulltabnle distribute by mntid sort by mnname;

先以mntid进行hash,在mnname进行排序

cluster by

cluster by=distribute by+sort by :不支持排序,sort by 不管数据拉取,cluster by 考虑数据拉取,排序条件正好跟数据拉取条件一样

你可能感兴趣的:(hive)