复习打卡大数据篇——HIVE 03

目录

[1. HIVESQL DQL语句](#1. HIVESQL DQL语句)

[2. HIVE JOIN](#2. HIVE JOIN)

[3. HIVE 内置函数](#3. HIVE 内置函数)


1. HIVESQL DQL语句

select语法树:

sql 复制代码
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
JOIN table_other ON expr
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]

Having和where的区别?

  • having是在分组后对数据进行过滤
  • where是在分组前对数据进行过滤
  • having后面可以使用聚合函数
  • where后面不可以使用聚合

LIMIT:

LIMIT接受一个或两个数字参数,这两个参数都必须是非负整数常量。

第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。当给出单个参数时,它代表最大行数,并且偏移量默认为0。

这将从结果集的第6行开始(偏移量为5),返回接下来的10行:

sql 复制代码
SELECT * FROM table_name ORDER BY column_name LIMIT 5, 10;

查询执行顺序:

from>where>group>having>order>select


SORT/ORDER/CLUSTER/DISTRIBUTE BY 区别

**OBERR BY:**order by是对输出的结果进行全局排序。全局排序意味着数据只能输出在一个文件中。因此也只能有一个reducetask。在order by出现的情况下,不管用户设置几个reducetask,在编译执行期间都会变为一个。默认排序为升序(ASC),也可以指定为DESC降序。

**CLUSTER BY:**根据指定字段将数据分组,每组内再根据该字段正序排序(只能正序)。分组规则hash散列与分桶表规则一样:hash_func(col_name) % reduce task nums。分为几组取决于reduce task的个数。如果用户没有设置,不指定reduce task个数。则hive根据表输入数据量自己评估,也可以手动设置:set mapreduce.job.reduces =2;

DISTRIBUTE BY +SORT BY:相当于把cluster by的功能一分为二。distribute by只负责分;sort by只负责分之后的每个部分排序。并且分和排序的字段可以不一样。数据按column1分布,每个Reducer内按column2排序:

sql 复制代码
SELECT * FROM table_name 
DISTRIBUTE BY column1 
SORT BY column2;

当分布列和排列表相同时,可以直接使用CLUSTER BY

sql 复制代码
SELECT * FROM table_name 
CLUSTER BY column1;

Union联合查询

在Hive中,UNION 用于将多个查询的结果集合并为一个结果集。UNION 操作符会去除重复的行(类似于集合的并集操作),而 UNION ALL 则会保留所有行,包括重复的行。所有查询的列数必须相同。对应列的数据类型必须兼容(例如,INTBIGINT 是兼容的,但 INTSTRING 不兼容)。最终结果集的列名由第一个查询的列名决定。如果需要对最终结果排序或限制行数,可以在最外层使用 ORDER BYLIMIT

sql 复制代码
SELECT name, age FROM table1
UNION ALL
SELECT name, age FROM table2
ORDER BY age LIMIT 10;

CTAS语句

CTAS 语句结合了 CREATE TABLESELECT 的功能,可以方便地将查询结果存储到一个新表中。

sql 复制代码
CREATE TABLE new_employee AS
SELECT name, age, department
FROM employee
WHERE age > 30;

创建一个名为 new_employee 的新表,包含 employee 表中 age > 30 的员工的 nameagedepartment 列。

2. HIVE JOIN

**inner join:**只返回两个表中都存在的记录。如果某一行在其中一个表中没有匹配,则不会返回.返回所有员工及其所属部门的名称:

sql 复制代码
SELECT e.name, e.age, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;

**left join:**返回左表中的所有行,以及右表中满足连接条件的匹配行。如果右表中没有匹配的行,则返回 NULL。返回所有员工及其所属部门的名称,即使某些员工没有分配部门:

sql 复制代码
SELECT e.name, e.age, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id;

**right join:**与左连接类似。

**full outer join:**返回两个表中的所有行,如果某一行在其中一个表中没有匹配,则返回 NULL。返回两个表的并集,返回所有员工和部门的信息,即使某些员工没有部门或某些部门没有员工:

sql 复制代码
SELECT e.name, e.age, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id = d.department_id;

**left semi join:**会返回左边表的记录,前提是其记录对于右边的表满足ON语句中的判定条件。
从效果上来看有点像inner join之后只返回左表的结果。

**cross join:**返回两个表的笛卡尔积,即左表的每一行与右表的每一行组合,结果集的行数等于左表的行数乘以右表的行数。

3. HIVE 内置函数

字符串相关:

sql 复制代码
-- 返回字符段长度 5
select length("hello");

-- 反转字符串 olleh
select reverse("hello");

-- 拼接字符串 hellohello
select concat("hello","hello");

-- 用指定字符拼接字符串 www.baidu.com
select concat_ws('.', 'www', array('baidu', 'com'));

-- 取索引的结果 lo el
select substr("hello",-2); --pos是从1开始的索引,如果为负数则倒着数
select substr("angelababy",2,2);

-- 大写 HELLO
select upper("hello");
select ucase("hello");

-- 小写 angelababy
select lower("HELLO");
select lcase("HELLO");

-- 去除左右空格 hello
select trim(" hello");

-- 去除左空格 hello
select ltrim(" hello");

-- 去除右空格  hello
select rtrim(" hello");

-- 正则替换 hello-hello
select regexp_replace('100-200', '(\\d+)', 'hello');

--正则抽取 200
select regexp_extract('100-200', '(\\d+)-(\\d+)', 2);

-- 取出域名 www.baidu.com
select parse_url('http://www.baidu.com/path/p1.php?query=1', 'HOST');

-- 复制字符串 hellohello
select repeat("hello",2);

-- 查询第一位ascii值 97
select ascii("abc");

--向左拼接指定长度 ???hello h
select lpad('hello', 5, '??');
select lpad('hi', 1, '??');

--向右拼接指定长度 hi???
select rpad('hi', 5, '??');

-- 按空白字符串切割 ["apache","hive"]
select split('apache hive', '\\s+');

--用于查找一个字符串在一个以逗号分隔的字符串列表中的位置。如果 string 不存在于 string_list 中,返回 0。
select find_in_set('a','abc,b,ab,c,def');

日期相关:

sql 复制代码
-- 查询当前日期函数 2025-01-07
select current_date();
-- 获取当前时间戳函数 
select current_timestamp();
-- 获取当前UNIX时间戳函数 
select unix_timestamp();
-- 日期转UNIX时间戳函数 1323262863
select unix_timestamp("2011-12-07 13:01:03");
-- 指定格式日期转UNIX时间戳函数 1323262863
select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss');
-- UNIX时间戳转日期函数 2021-05-11 08:55:23
select from_unixtime(1620723323);
select from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');
-- 日期比较函数 213
select datediff('2012-12-08','2012-05-09');
-- 日期增加函数 2012-03-09
select date_add('2012-02-28',10);
-- 日期减少函数 2011-12-22
select date_sub('2012-01-1',10);
--抽取日期函数: to_date
select to_date('2011-12-07 13:01:03');
--日期转年函数: year
select year('2011-12-07 13:01:03');
--日期转月函数: month
select month('2011-12-07 13:01:03');
--日期转天函数: day
select day('2011-12-07 13:01:03');
--日期转小时函数: hour
select hour('2011-12-07 13:01:03');
--日期转分钟函数: minute
select minute('2011-12-07 13:01:03');
--日期转秒函数: second
select second('2011-12-07 13:01:03');
--日期转周函数: weekofyear 返回指定日期所示年份第几周
select weekofyear('2011-12-07 13:01:03');

条件函数相关:

sql 复制代码
-- if条件判断 200
select if(1=2,100,200);
-- 空判断函数 false
select isnull("a");
-- true
select isnull(null);
-- 非空判断函数: true
select isnotnull("a");
-- false
select isnotnull(null);
-- 空值转换函数,如果第一个参数为空返回第二个参数,否则返回第一个 a
select nvl("a","b");
-- b
select nvl(null,"b");
-- 非空查找函数,返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL
-- 11
select COALESCE(null,11,22,33);
-- 33
select COALESCE(null,null,null,33);
-- NULL
select COALESCE(null,null,null);
-- 条件转换函数: CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END

数学函数相关:

sql 复制代码
--取整函数: round  返回double类型的整数值部分 (遵循四舍五入)
select round(3.14);

--指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
select round(3.1415926,1);

--向下取整函数: floor
select floor(3.14);
select floor(-3.14);

--向上取整函数: ceil
select ceil(3.14);
select ceil(-3.14);

--取随机数函数: 返回一个0到1范围内的随机数
select rand();

--指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列
select rand(2);

--二进制函数:  bin(BIGINT a)
select bin(18);

--进制转换函数: conv(BIGINT num, int from_base, int to_base)
select conv(17,10,16);

--绝对值函数: abs
select abs(-3);
相关推荐
兔子宇航员03013 小时前
数据开发八股文整理- Hadoop
大数据·hadoop·分布式
weixin_307779133 小时前
Azure Synapse Analytics和Azure Databricks的共同点和区别
数据仓库·spark·云计算·azure
大数据魔法师5 小时前
Hadoop - MapReduce编程
大数据·hadoop·mapreduce
兔子宇航员03015 小时前
Hadoop常见面试题
大数据·hadoop·分布式
王子良.5 小时前
Hadoop3.x 万字解析,从入门到剖析源码
大数据·开发语言·hadoop·经验分享·学习·开源
Faith_xzc5 小时前
Routine Load 导入问题处理指南
大数据·数据仓库·开源·数据库开发·doris
weixin_307779137 小时前
优化 Azure Synapse Dedicated SQL Pool中的 SQL 执行性能的经验方法
数据仓库·sql·性能优化·azure
m0_748231317 小时前
深入解析HDFS:定义、架构、原理、应用场景及常用命令
hadoop·hdfs·架构
MasterNeverDown18 小时前
如何将 DotNetFramework 项目打包成 NuGet 包并发布
大数据·hadoop·hdfs