【Hive】函数及DQL收尾
Hive–DQL
正则匹配
正则表达式(Regexp)介绍:
概述:
正确的, 符合特定规则的字符串.
Regular Expression
细节:
正则表达式不独属于任意的一种语言, 市场上大多数的语言都支持正则, 例如: Java, Python, HiveSQL, JavaScript等…
要求: 能用我们讲的规则, 看懂别人写的 正则表达式(式子)即可.
正则规则:1
2
3
4
5
6
7
8
9
10
11^ 代表: 正则开头
$ 代表: 正则结尾
a 代表: 1个字符a
. 代表: 任意的1个字符
\. 代表: 取消.的特殊含义, 即只把它当做1个普通的 点(.)
\\ 代表: 一个 \
[abc] 代表: a,b,c中的任意1个字符
[^abc] 代表: 除了a,b,c外的的任意1个字符
\d 代表: 任意的1个整数, 等价于 [0-9]
\w 代表: 任意的1个单词字符, 即: 数字, 字母, 下划线, 等价于 [0-9a-zA-Z_]
\S 代表: 任意的1个非空字符1
2
3
4
5
6? 代表: 至少0次, 至多1次
* 代表: 至少0次, 至多n次(无所谓)
+ 代表: 至少1次, 至多n次(无所谓)
x{n} 代表: x恰好出现 n次(多一次, 少一次都不行)
x{n,} 代表: x至少出现n次, 至多无所谓.
x{n,m} 代表: x至少出现n次, 至多m次, 包括n和m
Pay Attention Please
1 | -- 查找手机号符合:188****0*** (四种写法) |
联合查询
联合查询解释:
概述:
联合查询指的是 union 查询, 目的: 达到类似于拼接表的操作, 把多张表拼接到一起.
格式:
select ... from …
union all / distinct
select ... from …
细节:
1. 如果直接写union, 后边啥都不写, 默认是: union distinct
2. union all是合并, 但是不去重.
union distinct是合并, 但是去重.
- 要进行合并的表, 字段个数, 对应`的数据类型必须保持一致.
1 | select * from stu |
随机抽样
随机抽样解释:
概述:
它表示我们通过 tablesample()函数实现, 从大表中抽取出一定的样本数据.
格式:
tablesample(bucket x out of y on 列名 或者 rand());
细节:
1. y表示分成几个桶, 即: 桶的个数.
2. x表示从桶内抽取第x份(条)--将表按照男女分成两个组,第一组必然是女生,第二组必定全部是男
3. 根据列名抽取, 相当于把该列当做了分桶字段抽取, 列名一致的情况下, 其它条件不变(桶的数据等...), 每次抽取到的数据都一样.
4. rand()表示随机数, 即随机抽取, 每次采集到的数据都不一样.
5. x 不能比 y 大.
1 | select * from stu tablesample ( bucket 2 out of 2 on gender); -- 按照gender将stu表分成两个桶,取第二份 |
虚拟列
虚拟列介绍:
概述:
属于Hive内置的, 数据本身的参数, 辅助我们进行查询的.
分类:
INPUT__FILE__NAME
显示数据行所在的 数据文件
BLOCK__OFFSET__INSIDE__FILE
显示数据行所在的 数据文件中的 行偏移量(即: 起始索引)
95001,李勇,男,20,CS 行偏移量(即: 起始索引): 0
95002,刘晨,女,19,IS 行偏移量(即: 起始索引): 23
95003,王敏,女,22,MA 行偏移量(即: 起始索引): 46
ROW__OFFSET__INSIDE__BLOCK
显示数据所在的HDFS块的偏移量, 该虚拟列必须要设置才能用, 即: set hive.exec.rowoffset=true
显示数据行 所在的 Block块的 编号(从 0 开始)
细节:
1. `1个中文, gbk码表占2个字节, utf-8码表占3个字节`
2. `row__offset__inside__block`
3. 就三个内置函数掌握就完事了
1 | select id,INPUT__FILE__NAME from stu; -- 查看数据行所在的数据文件(file) |
Hive函数
Hive函数介绍:
最初Hive函数分为 内置函数 和 用户自定义函数两大类, 其中用户自定义函数又被分为3类, 分别是:
内置函数: 属于Hive自带的.
用户自定义函数:
UDF: 全称叫 User Defined Functions, 普通函数, 即: 一进一出.
例如: select * from stu;
UDAF: 全称叫 User Defined Aggregation Functions, 聚合函数, 即: 多进一出.
例如: select count(id) from stu;
UDTF: 全称叫 User Defined Table-Generating Functions, 表生成函数, 即: 一进多出.
例如: select explode(array(11, 22, 33));
后来发现用 UDF, UDAF, UDTF来划分Hive函数实在是太方便了, 于是提出了1个词, 叫: 函数标准扩大化
, 即:
UDF, UDAF, UDTF本来是形容用户自定义函数的, 现在, hive中的函数没有内置函数 和 自定义函数之分了, 取而代之的是: UDF, UDAF, UDTF
Hive官网, 函数解释:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-MathematicalFunctions
Hive函数,必须要掌握的.
show functions;– 查看hive所有内置函数, 289个, 其中, 符号也是Hive函数一种, 只不过函数名是符号而已.
describe function extended 函数名;– 查看函数详细信息.
split() substr() concat_ws() date_add() datediff() year() round() rand() cast() coalesce() case...when... get_json_object() explode() collect_list() row_number() rank() dense_rank() ntile() lag()
函数忘了咋用?不存在的
1 | show functions ; -- 查看所有函数 |
字符串相关函数
1 | select substr('abs123',1,3); -- 提取函数的子串,(字符串,起始位置,子串个数) 效果和substring |
日期相关函数
这里有个借助日期函数判断闰年的比较重要嗷
1 | select current_date(); -- 获取当前的日期 |
数字相关函数
1 | select rand(); -- 产生一个0.0-1.0之间的随机数,如果不指定种子seed则随机数一直会不确定 |
非空检验 相关函数
1 | select if(5>3,'郑州','信阳'); -- if条件判断(条件,如果满足,如果不满足 |
杂项函数
1 | -- 类型转换相关. |
行列转换入门Expolde函数
1 | select explode(champion_year) from the_nba_championship; -- 爆炸函数,将数组元素炸开 |
行列转换之: 行转列
1 | select * from row2col2; |
行列转换之: 列转行
1 | create table col2row2( |
处理json字符串
1 | select get_json_object('{"name":"杨过"}', '$.name'); |
CTE表达式
CTE表达式介绍:
概述:
全称叫 Common Table Expression, 公共表表达式, 用来(临时)存储表结果的, 后续可以重复使用.
格式:
with CTE表达式的别名 as ( 被CTE所存储的内容, 即: SQL查询语句 ) select ... from cte表达式别名;
1 | -- 1. CTE表达式入门. |