Hive SQL / SQL

  • [1. 建表 & 拉取表](#1. 建表 & 拉取表)
  • [2. 插入数据 insert + select](#2. 插入数据 insert + select)
  • [3. 查询](#3. 查询)
    • [3.1 查询语句语法/顺序](#3.1 查询语句语法/顺序)
    • [3.2 关系操作符](#3.2 关系操作符)
    • [3.3 聚合函数](#3.3 聚合函数)
    • [3.4 where](#3.4 where)
    • [3.5 分组聚合](#3.5 分组聚合)
    • [3.6 having 筛选分组后结果](#3.6 having 筛选分组后结果)
    • [3.7 显式类型转换 & select产生指定值的列](#3.7 显式类型转换 & select产生指定值的列)
  • [4. join 横向拼接](#4. join 横向拼接)
    • [4.1 等值连接 & 不等值连接](#4.1 等值连接 & 不等值连接)
    • [4.2 两表连接](#4.2 两表连接)
      • [4.2.1 内连接](#4.2.1 内连接)
      • [4.2.2 左外连接 & 右外连接](#4.2.2 左外连接 & 右外连接)
      • [4.2.3 满外连接](#4.2.3 满外连接)
    • [4.3 多表连接](#4.3 多表连接)
    • [4.4 笛卡尔积](#4.4 笛卡尔积)
  • [5. union 纵向拼接](#5. union 纵向拼接)
  • [6. 排序](#6. 排序)
    • [6.1 order by 全局排序](#6.1 order by 全局排序)
    • [6.2 sort by reduce内部排序](#6.2 sort by reduce内部排序)
  • [7. 其他](#7. 其他)
    • [7.1 select中判断筛选出null](#7.1 select中判断筛选出null)
      • [7.1.1 MYSQL ifnull](#7.1.1 MYSQL ifnull)
      • [7.1.2 Hive SQL if( , , )](#7.1.2 Hive SQL if( , , ))

1. 建表 & 拉取表

建表

sql 复制代码
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"; -- 列间隔符

加载数据

sql 复制代码
-- 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');

2. 插入数据 insert + select

sql 复制代码
-- overwrite 覆盖
-- into 追加
insert overwrite/into table table1
select id
	  ,name
from table2;
sql 复制代码
-- 一次查询,插入多个表或分区
from table2
insert into/overwrite table table1 partition(dt="01")
select_value1
insert into/overwrite table table1 partition(dt="02")
select_value2
;

3. 查询

3.1 查询语句语法/顺序

注意先后顺序

sql 复制代码
select all/distinct expr1
				    ,expr2
from table_name
where condition -- 过滤
group by condition -- 分组查询
having condition -- 分组后组内过滤
order by col_list -- 最终查询结果排序
limit number
offset number
;

3.2 关系操作符

sql 复制代码
-- <==> 都为null或都不为null,返回true
where A <==> B 

-- 判空,必须用is (not) null
-- 若string类型为"",则hive的is null判断反回为False
where job is null

-- in 集合
where job(col_name) in('研发', '销售')

3.3 聚合函数

多行数据一起计算,返回一行值

sql 复制代码
count(*) 统计行数,包含null
count(col_name) 统计指定列的行数,不包含null
max() 不包含null
min()
sum()
avg()

select count(*) from table1;

3.4 where

sql 复制代码
-- where 中可以使用函数
select * from table1 where length(name) > 5;
-- where中不能使用聚合函数

3.5 分组聚合

选择分组后,select字段只能选择 分组的字段(job)、聚合函数。

sql 复制代码
-- 分组后, 组内count(*)
select job
	   ,count(*)
from emp
group by job
;

3.6 having 筛选分组后结果

sql 复制代码
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;

3.7 显式类型转换 & select产生指定值的列

sql 复制代码
select
	'none' as none_col1,
	cast('none' as int) as none_col2

显示类型转换

cast('100' as int)

select cast(12.1 as int); >>> 12

4. join 横向拼接

4.1 等值连接 & 不等值连接

sql 复制代码
-- 等值连接
select 
	*
from table1
join table2
on table1.id = table2.id
;

-- 不等值连接
on 中不是"=", 早期版本hive 不支持不等值连接

4.2 两表连接

4.2.1 内连接

joininner join

两表连接字段的交集,不能join的行不显示。

sql 复制代码
select 
	tb1.name,
	tb2.name
from table1 tb1
join / inner join table2 tb2
on tb1.id = tb2.id;

4.2.2 左外连接 & 右外连接

left joinleft outer join

保留左表所有数据,右表补空。

右外连接 相反。

sql 复制代码
select 
	tb1.name,
	tb2.name
from table1 tb1
left/right join table2 tb2
on tb1.id = tb2.id;

4.2.3 满外连接

full joinfull outer join

保留两表左右,不能连接的字段补空。

sql 复制代码
select 
	tb1.name,
	tb2.name
from table1 tb1
full join table2 tb2
on tb1.id = tb2.id;

4.3 多表连接

sql 复制代码
select
	*
from table1
join table2
on table1.id = table2.id
join table3
on table2.name = table3.name
sql 复制代码
(
	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

4.4 笛卡尔积

sql 复制代码
select 
	*
from table1
join table2

-- 或
select 
	*
from table1, table2

5. union 纵向拼接

  1. 两表上下拼接,对应字段的数量、类型都必须相同;
  2. 对应字段名不一样,能连接上;最终字段名以第一个表的字段名为准;
  3. union 连接的必须是select查询语句;
  4. 连接完后,当成一个select查询使用就行;
  5. union all 不会对相同数据去重,union会对上下两部分相同部分去重。
sql 复制代码
select 
	*
from stu
where score = 30
union
select 
	*
from stu
where score = 40
;

6. 排序

6.1 order by 全局排序

默认升序(asc), desc 降序descend

hive 最终执行reduce时,只能一个reduce以实现全局排序,数据量大时order by不合适;

可以使用order by + limit n ,每个Map取出n个,减少了reduce时的压力

sql 复制代码
select
	*
from table1
order by col_name desc
;

6.2 sort by reduce内部排序

保证每个reduce内有序,全局不保证有序。

sql 复制代码
-- 设置reduce个数
set mapreduce.job.reduces=3;
-- 查看reduce个数
set mapreduce.job.reduces;

-- reduce内部排序
select
	*
from emp
sort by col_1 desc;

7. 其他

7.1 select中判断筛选出null

7.1.1 MYSQL ifnull

筛选出第二大的,但可能初筛排序后只有一个,再筛第二大为null

ifnull 指定为null时,替换为什么值。

sql 复制代码
select
	ifnull(
		(
			select
				salary
			from Employee
			order by salary desc
			limit 1
			offset 1
		)
		,null
	) as No2_highest_salary

7.1.2 Hive SQL if( , , )

如果column是null,返回第二个值,不是则返回第三个值

sql 复制代码
if(column is null, 'IS NULL', 'IS NOT NULL')
相关推荐
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
tryCbest5 天前
数据库SQL学习
数据库·sql
十月南城5 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
王九思5 天前
Hive Thrift Server 介绍
数据仓库·hive·hadoop
cowboy2585 天前
mysql5.7及以下版本查询所有后代值(包括本身)
数据库·sql
努力的lpp5 天前
SQL 报错注入
数据库·sql·web安全·网络安全·sql注入
麦聪聊数据5 天前
统一 Web SQL 平台如何收编企业内部的“野生数据看板”?
数据库·sql·低代码·微服务·架构
山峰哥5 天前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器
Asher05095 天前
Hive核心知识:从基础到实战全解析
数据仓库·hive·hadoop