建表
create table student(
name string,
age BIGINT,
subject array<string>, -- 学科
score map<string, float>, -- 学科对应成绩
address struct<houseNumber: int, street: string>
)
row format delimited
fields terminated by "\t"; -- 列间隔符
加载数据
-- local 从本地加载,省略则从HDFS加载
load data local inpath '/root/covid/2020-02.csv' into table covid2020;
-- 加载数据到分区
load data inpath '/data/covid/2020-02.csv' into table covid2020 partition(dt='2020-02');
-- overwrite 覆盖
-- into 追加
insert overwrite/into table table1
select id
,name
from table2;
-- 一次查询,插入多个表或分区
from table2
insert into/overwrite table table1 partition(dt="01")
select_value1
insert into/overwrite table table1 partition(dt="02")
select_value2
;
注意先后顺序
select all/distinct expr1
,expr2
from table_name
where condition -- 过滤
group by condition -- 分组查询
having condition -- 分组后组内过滤
order by col_list -- 最终查询结果排序
limit number
offset number
;
-- <==> 都为null或都不为null,返回true
where A <==> B
-- 判空,必须用is (not) null
-- 若string类型为"",则hive的is null判断反回为False
where job is null
-- in 集合
where job(col_name) in('研发', ‘销售’)
多行数据一起计算,返回一行值
count(*) 统计行数,包含null
count(col_name) 统计指定列的行数,不包含null
max() 不包含null
min()
sum()
avg()
select count(*) from table1;
-- where 中可以使用函数
select * from table1 where length(name) > 5;
-- where中不能使用聚合函数
选择分组后,select字段只能选择 分组的字段(job)、聚合函数。
-- 分组后, 组内count(*)
select job
,count(*)
from emp
group by job
;
select job
,count(*) cnt
from emp
group by job
having cnt >= 2;
-- 相当于
select job
,cnt
from
(
select job
,count(*) cnt
from emp
group by job
) t
where cnt >= 2;
select
'none' as none_col1,
cast('none' as int) as none_col2
显示类型转换
cast(‘100’ as int)
select cast(12.1 as int); >>> 12
-- 等值连接
select
*
from table1
join table2
on table1.id = table2.id
;
-- 不等值连接
on 中不是"=", 早期版本hive 不支持不等值连接
join
或inner join
;
两表连接字段的交集,不能join的行不显示。
select
tb1.name,
tb2.name
from table1 tb1
join / inner join table2 tb2
on tb1.id = tb2.id;
left join
或left outer join
;
保留左表所有数据,右表补空。
右外连接 相反。
select
tb1.name,
tb2.name
from table1 tb1
left/right join table2 tb2
on tb1.id = tb2.id;
full join
或full outer join
保留两表左右,不能连接的字段补空。
select
tb1.name,
tb2.name
from table1 tb1
full join table2 tb2
on tb1.id = tb2.id;
select
*
from table1
join table2
on table1.id = table2.id
join table3
on table2.name = table3.name
(
select
id, name
from stu_info
where course_id = '01'
) t1
full outer join
(
select
id, name
from stu_info
where course_id = '02'
) t2
on t1.id = t2.id
full outer join
(
select
id, name
from stu_info
where course_id = '03'
) t3
-- 如果某id 不在t1中在t2中
-- 如果t1.id 为空则返回t2.id,如果不为空则返回t1.id
on nvl(t1.id, t2.id) = t3.id
select
*
from table1
join table2
-- 或
select
*
from table1, table2
union
连接的必须是select
查询语句;select
查询使用就行;union all
不会对相同数据去重,union
会对上下两部分相同部分去重。select
*
from stu
where score = 30
union
select
*
from stu
where score = 40
;
默认升序(asc), desc 降序descend
hive 最终执行reduce时,只能一个reduce以实现全局排序,数据量大时order by不合适;
可以使用order by + limit n ,每个Map取出n个,减少了reduce时的压力
select
*
from table1
order by col_name desc
;
保证每个reduce内有序,全局不保证有序。
-- 设置reduce个数
set mapreduce.job.reduces=3;
-- 查看reduce个数
set mapreduce.job.reduces;
-- reduce内部排序
select
*
from emp
sort by col_1 desc;
筛选出第二大的,但可能初筛排序后只有一个,再筛第二大为null
ifnull 指定为null时,替换为什么值。
select
ifnull(
(
select
salary
from Employee
order by salary desc
limit 1
offset 1
)
,null
) as No2_highest_salary
如果column是null,返回第二个值,不是则返回第三个值
if(column is null, 'IS NULL', 'IS NOT NULL')