复习打卡大数据篇——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);
相关推荐
tsyjjOvO3 天前
SpringMVC 从入门到精通
数据仓库·hive·hadoop
Francek Chen3 天前
【大数据存储与管理】分布式数据库HBase:05 HBase运行机制
大数据·数据库·hadoop·分布式·hdfs·hbase
zzzzzwbetter3 天前
Hadoop完全分布式部署-Master的NameNode以及Slaver2的DataNode未启动
大数据·hadoop·分布式
weixin_449310843 天前
ETL转换和数据写入小满OKKICRM的技术细节
数据仓库·php·etl
IvanCodes3 天前
Hive IDE连接及UDF实战
ide·hive·hadoop
yumgpkpm3 天前
华为昇腾910B 开源软件GPUStack的介绍(Cloudera CDH、CDP)
人工智能·hadoop·elasticsearch·flink·kafka·企业微信·big data
lifewange4 天前
Hive数据库
数据库·hive·hadoop
五月天的尾巴5 天前
hive数据库模糊查询表名
hive·查询表名
蓝魔Y5 天前
hive—1.1、执行优化
hive
快乐非自愿5 天前
OpenClaw 生态适配:Hadoop/Hive 技能现状与企业级集成方案
大数据·hive·hadoop·分布式·openclaw