常用 SQL
# 启动Beeline客户端:
/usr/local/hive/bin/beeline
# 连接HiveServer2服务:
!connect jdbc:hive2://kube-40:10000
/usr/local/hive/bin/beeline -u jdbc:hive2://kube-40:10000 -n hadoop
-- 创建数据库
create database if not exists myhive;
use myhive;
-- 查看数据库详细信息
desc database myhive;
-- 创建数据库并指定hdfs存储位置
create database myhive2 location '/myhive2';
-- 使用location关键字,可以指定数据库在HDFS的存储路径。
-- 删除一个空数据库,如果数据库下面有数据表,那么就会报错
drop database myhive;
-- 强制删除数据库,包含数据库下面的表一起删除
drop database myhive2 cascade;
-- 数据库修改LOCATION 需要HDFS全路径
ALTER DATABASE myhive SET LOCATION 'hdfs://kube-40:8020/myhive';
-- 创建表的语法
CREATE [EXTERNAL] TABLE tb_name
(col_name col_type [COMMENT col_comment], ......)
[COMMENT tb_comment]
[PARTITIONED BY(col_name, col_type, ......)]
[CLUSTERED BY(col_name, col_type, ......) INTO num BUCKETS]
[ROW FORMAT DELIMITED FIELDS TERMINATED BY '']
[LOCATION 'path']
-- 创建示例表
CREATE TABLE test(
id INT,
name STRING,
gender STRING
);
-- 查看表
DESCRIBE test;
desc test;
-- 删除表
DROP TABLE table_name;
-- 基于其它表的结构建表
CREATE TABLE tbl_name LIKE other_tbl;
-- 基于查询结果建表
CREATE TABLE tbl_name AS SELECT ...;
-- 重命名表
ALTER TABLE old RENAME TO new;
-- 修改属性
ALTER TABLE tbl SET TBLPROPERTIES(key=value);
-- 常用属性
("EXTERNAL"="TRUE") -- 内外部表,TRUE表示外部表
('comment' = new_comment) -- 修改表注释
-- 内部表(CREATE TABLE table_name ......)
-- 未被external关键字修饰的即是内部表, 即普通表。 内部表又称管理表,
-- 内部表数据存储的位置由hive.metastore.warehouse.dir参数决定(默认:/user/hive/warehouse),
-- 删除内部表会直接删除元数据(metadata)及存储数据,因此内部表不适合和其他工具共享数据。
-- 外部表(CREATE EXTERNAL TABLE table_name ......LOCATION......)
-- 被external关键字修饰的即是外部表, 即关联表。
-- 外部表是指表数据可以在任何位置,通过LOCATION关键字指定。
-- 数据存储的不同也代表了这个表在理念是并不是Hive内部管理的,而是可以随意临时链接到外部数据上的。
-- 所以,在删除外部表的时候, 仅仅是删除元数据(表的信息),不会删除数据本身。
-- 必须使用row format delimited fields terminated by指定列分隔符
-- 必须使用LOCATION指定数据路径
-- 自定义分隔符
create table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t';
-- row format delimited fields terminated by '\t':表示以\t分隔
-- 先创建外部表,然后移动数据到LOCATION目录
-- 首先检查:确认不存在/tmp/test_ext1目录
hadoop fs -ls /tmp
-- 创建外部表:
create external table test_ext1(id int, name string) row format delimited fields terminated by '\t' location '/tmp/test_ext1';
-- 可以看到,目录/tmp/test_ext1被创建
select * from test_ext1,空结果,无数据
-- 上传数据:
hadoop fs -put test_external.txt /tmp/test_ext1/
-- 即可看到数据结果
select * from test_ext1
-- 先存在数据,后创建外部表
hadoop fs -mkdir /tmp/test_ext2
hadoop fs -put test_external.txt /tmp/test_ext2/
create external table test_ext2(id int, name string) row format delimited fields terminated by '\t' location '/tmp/test_ext2';
select * from test_ext2;
-- 删除外部表
drop table test_ext1;
drop table test_ext2;
-- 在Hive中通过show table,表不存在了,但是在HDFS中,数据文件依旧保留
-- 内外部表转换
-- 内部表转外部表
alter table stu set tblproperties('EXTERNAL'='TRUE');
-- 外部表转内部表
alter table stu set tblproperties('EXTERNAL'='FALSE');
-- 数据加载
-- 进入sql终端
/usr/local/hive/bin/beeline -u jdbc:hive2://kube-40:10000 -n hadoop
-- 数据加载 - LOAD语法
CREATE TABLE myhive.test_load(
dt string comment '时间(时分秒)',
user_id string comment '用户ID',
word string comment '搜索词',
url string comment '用户访问网址'
) comment '搜索引擎日志表' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
-- 从本地加载数据到表中
load data local inpath '/home/hadoop/search_log.txt' into table myhive.test_load;
-- 从HDFS加载数据到表中
-- overwrite:表示覆盖原表数据,即先清空表数据,再插入新数据。
-- 注意 加载完成后原文件会被删除
load data inpath '/tmp/search_log.txt' overwrite into table myhive.test_load;
-- 数据加载 - INSERT SELECT 语法
-- 语法如下:将SELECT查询语句的结果插入到其它表中,被SELECT查询的表可以是内部表或外部表。
INSERT [OVERWRITE | INTO] TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
-- 示例:
INSERT INTO TABLE tbl1 SELECT * FROM tbl2;
INSERT OVERWRITE TABLE tbl1 SELECT * FROM tbl2;
-- OVERWRITE:表示覆盖原表数据,即先清空表数据,再插入新数据。
-- hive表数据导出 - insert overwrite 方式
-- 将hive表中的数据导出到其他任意目录,例如linux本地磁盘,例如hdfs,例如mysql等等
-- 语法:
insert overwrite [local] directory 'path' select_statement1 FROM from_statement;
-- 将查询的结果导出到本地 - 使用默认列分隔符
insert overwrite local directory '/home/hadoop/export1' select * from test_load ;
-- 将查询的结果导出到本地 - 指定列分隔符
insert overwrite local directory '/home/hadoop/export2' row format delimited fields terminated by '\t' select * from test_load;
-- 将查询的结果导出到HDFS上(不带local关键字)
insert overwrite directory '/tmp/export' row format delimited fields terminated by '\t' select * from test_load;
-- hive表数据导出 - hive shell
-- 基本语法:(hive -f/-e 执行语句或者脚本 > file)
/usr/local/hive/bin/hive -e "select * from myhive.test_load;" > /home/hadoop/export3/export4.txt
-- 执行sql脚本
echo "select * from myhive.test_load;" > export.sql
/usr/local/hive/bin/hive -f export.sql > /home/hadoop/export4/export4.txt
-- array、map、struct复杂类型
1. array类型,主要存储:数组格式
2. map类型,主要存储:Key-Value格式
3. struct类型,主要存储:复合格式,可以包含多个
-- array类型
create table myhive.test_array(name string, work_locations array<string>)
row format delimited fields terminated by '\t'
COLLECTION ITEMS TERMINATED BY ',';
-- row format delimited fields terminated by '\t' 表示列分隔符是\t
-- COLLECTION ITEMS TERMINATED BY ',' 表示集合(array)元素的分隔符是逗号
-- 导入数据
load data local inpath '/home/hadoop/data_for_array_type.txt' overwrite into table myhive.test_array;
-- 查询所有数据
select * from myhive.test_array;
-- 查询loction数组中第一个元素
select name, work_locations[0] location from myhive.test_array;
-- 查询location数组中元素的个数
select name, size(work_locations) location from myhive.test_array;
-- 查询location数组中包含tianjin的信息
select * from myhive.test_array where array_contains(work_locations,'tianjin');
-- map类型
-- map类型其实就是简单的指代:Key-Value型数据格式。 有如下数据文件,其中members字段是key-value型数据
-- 字段与字段分隔符: “,”;需要map字段之间的分隔符:"#";map内部k-v分隔符:":"
id,name,members,age
1,zhangsan,father:xiaoming#mother:xiaohuang#brother:xiaoxu,28
2,lisi,father:mayun#mother:huangyi#brother:guanyu,22
3,wangwu,father:wangjianlin#mother:ruhua#sister:jingtian,29
4,mayun,father:mayongzhen#mother:angelababy,26
-- 创建表
create table myhive.test_map(
id int, name string, members map<string,string>, age int
)
row format delimited
fields terminated by ','
COLLECTION ITEMS TERMINATED BY '#'
MAP KEYS TERMINATED BY ':';
-- MAP KEYS TERMINATED BY ':' 表示key-value之间用:分隔
-- 导入数据
load data local inpath '/home/hadoop/data_for_map_type.txt' overwrite into table myhive.test_map;
-- # 查询全部
select * from myhive.test_map;
-- # 查询father、mother这两个map的key
select id, name, members['father'] father, members['mother'] mother, age from myhive.test_map;
-- # 查询全部map的key,使用map_keys函数,结果是array类型
select id, name, map_keys(members) as relation from myhive.test_map;
-- # 查询全部map的value,使用map_values函数,结果是array类型
select id, name, map_values(members) as relation from myhive.test_map;
-- # 查询map类型的KV对数量
select id,name,size(members) num from myhive.test_map;
-- # 查询map的key中有brother的数据
select * from myhive.test_map where array_contains(map_keys(members), 'brother');
-- struct类型
-- struct类型是一个复合类型,可以在一个列中存入多个子列,每个子列允许设置类型和名称
-- 有如下数据文件,说明:字段之间#分割,struct之间冒号分割
1#周杰轮:11
2#林均杰:16
3#刘德滑:21
4#张学油:26
5#蔡依临:23
-- 创建表
create table myhive.test_struct(
id string, info struct<name:string, age:int>
)
row format delimited
fields terminated by '#'
COLLECTION ITEMS TERMINATED BY ':';
-- COLLECTION ITEMS TERMINATED BY ':' 表示struct字段之间的分隔符是冒号
-- 导入数据
load data local inpath '/home/hadoop/data_for_struct_type.txt' into table myhive.test_struct;
-- # 查询所有数据
select * from test_struct;
-- # 直接使用列名.子列名 即可从struct中取出子列查询
select id, info.name from test_struct;
-- 分区表
-- 分区表是Hive为了优化查询速度而设计的一种表,它将一个大的表根据分区键分割成多个小表,每个小表称为一个分区
-- 同时Hive也支持多个字段作为分区,多分区带有层级关系
-- 基本语法:
create table tablename(...) partitioned by (分区列 列类型, ......)
row format delimited fields terminated by '';
-- 创建分区表
create table score(s_id string,c_id string, s_score int) partitioned by (month string) row
format delimited fields terminated by '\t';
-- 创建多级分区表
create table score2 (s_id string,c_id string, s_score int) partitioned by (year string,month
string,day string) row format delimited fields terminated by '\t';
-- 加载数据到分区表
load data local inpath '/home/hadoop/score.txt' into table score partition (month='202409');
-- 加载数据到一个多分区的表
load data local inpath '/home/hadoop/score.txt' into table score2 partition(year='2024',month='09',day='20');
-- hdfs文件目录如下:
myhive.db/score2/year=2024
myhive.db/score2/year=2024/month=09
myhive.db/score2/year=2024/month=09/day=20
myhive.db/score2/year=2024/month=09/day=20/score.txt
-- 查看表的分区
show partitions score;
-- 添加分区
alter table score add partition(month='202410');
-- 修改分区值 HDFS目录同步修改
ALTER TABLE score PARTITION (month='202410') RENAME TO PARTITION (month='202412');
-- 删除分区 HDFS目录同步删除
ALTER TABLE score DROP PARTITION (month='202412');
-- 创建外部分区表,并指定文件数据存放路径
hadoop fs -mkdir -p /scoredatas/month=202409
hadoop fs -put /home/hadoop/score.txt /scoredatas/month=202409/
create external table score4(s_id string, c_id string,s_score int) partitioned by (month
string) row format delimited fields terminated by '\t' location '/scoredatas';
-- 进行表的修复建立表与数据文件之间的一个关系映射
msck repair table score4;
-- 第二种方式 上传数据之后手动添加分区即可
alter table score4 add partition(month='202409');
-- 删除外部表,清理HDFS上的数据
drop table score4;
hadoop fs -rm -r /scoredatas;
-- 分桶表
-- 和分区不同,分区是将表拆分到不同的子文件夹中进行存储,而分桶是将表拆分到固定数量的不同文件中进行存储。
-- 分桶表创建
-- 开启分桶的自动优化(自动匹配reduce task数量和桶数量一致)
set hive.enforce.bucketing=true;
-- 创建分桶表,开启三个桶文件
create table course (c_id string,
c_name string,
t_id string) clustered by(c_id)
into 3 buckets row format delimited fields terminated by '\t';
-- 桶表的数据加载,由于桶表的数据加载通过load data无法执行,只能通过insert select
-- 1. 创建一个临时表(外部表或内部表均可),通过load data加载数据进入表
create table course_common (c_id string,c_name string,t_id string) row format delimited
fields terminated by 't';
load data local inpath '/home/hadoop//course.txt' overwrite into table course_common;
-- 2. 然后通过insert select 从临时表向桶表插入数据
insert overwrite table course select * from course_common cluster by(c_id);
-- 注:数据的三份划分基于分桶列的值进行hash取模来决定,由于load data不会触发MapReduce,
-- 也就是没有计算过程(无法执行Hash算法),只是简单的移动数据而已,所以无法用于分桶表数据插入。
-- 分3桶,基于Hash取模,数据中的每一个分桶列的值,都被hash取模得到0、1、2其中一个数,基于结果,存入对应序号的桶文件中。
-- 分桶表性能提升
-- 如果说分区表的性能提升是:在指定分区列的前提下,减少被操作的数据量,从而提升性能。
-- 分桶表的性能提升就是:基于分桶列的特定操作,如:过滤、JOIN、分组,均可带来性能提升。
SELECT、聚合、GROUP BY、JOIN、ORDER BY等基础SQL查询
-- 查询语句的基本语法
SELECT [ALL | DISTINCT]select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BYcol_list]
[HAVING where_condition]
[ORDER BYcol_list]
[CLUSTER BYcol_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number]
-- 准备数据:
-- 订单表
CREATE TABLE myhive.orders (
orderId bigint COMMENT '订单id',
orderNo string COMMENT '订单编号',
shopId bigint COMMENT '门店id',
userId bigint COMMENT '用户id',
orderStatus tinyint COMMENT '订单状态 -3:用户拒收 -2:未付款的订单 -1:用户取消 0:待发货 1:配送中 2:用户确认收货',
goodsMoney double COMMENT '商品金额',
deliverMoney double COMMENT '运费',
totalMoney double COMMENT '订单金额(包括运费)',
realTotalMoney double COMMENT '实际订单金额(折扣后金额)',
payType tinyint COMMENT '支付方式,0:未知;1:支付宝,2:微信;3、现金;4、其他',
isPay tinyint COMMENT '是否支付 0:未支付 1:已支付',
userName string COMMENT '收件人姓名',
userAddress string COMMENT '收件人地址',
userPhone string COMMENT '收件人电话',
createTime timestamp COMMENT '下单时间',
payTime timestamp COMMENT '支付时间',
totalPayFee int COMMENT '总支付金额'
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
-- 用户表
CREATE TABLE myhive.users (
userId int,
loginName string,
loginSecret int,
loginPwd string,
userSex tinyint,
userName string,
trueName string,
brithday date,
userPhoto string,
userQQ string,
userPhone string,
userScore int,
userTotalScore int,
userFrom tinyint,
userMoney double,
lockMoney double,
createTime timestamp,
payPwd string,
rechargeMoney double
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
-- 加载数据
LOAD DATA LOCAL INPATH '/home/hadoop/itheima_orders.txt' INTO TABLE myhive.orders;
LOAD DATA LOCAL INPATH '/home/hadoop/itheima_users.txt' INTO TABLE myhive.users;
-- SELECT 基本查询
-- 查询所有
SELECT * FROM myhive.orders;
-- 查询单列
SELECT orderid, totalmoney, username, useraddress, paytime FROM myhive.orders;
-- 查询数据量
SELECT COUNT(*) FROM myhive.orders;
-- 过滤广东省订单
SELECT * FROM myhive.orders WHERE useraddress LIKE '%广东%';
-- 找出广东省单笔营业额最大的订单
SELECT * FROM myhive.orders WHERE useraddress like '%广东%' ORDER BY totalmoney DESC LIMIT 1;
-- 分组、聚合
-- 统计未支付、已支付各自的人数
SELECT ispay, COUNT(*) AS cnt FROM myhive.orders GROUP BY ispay;
-- 在已付款订单中,统计每个用户最高的一笔消费金额
SELECT userid, MAX(totalmoney) AS max_money FROM myhive.orders WHERE ispay = 1 GROUP BY userid;
-- 统计每个用户的平均订单消费额
SELECT userid, AVG(totalmoney) FROM myhive.orders GROUP BY userid;
-- 统计每个用户的平均订单消费额,过滤大于10000的数据
SELECT userid, AVG(totalmoney) AS avg_money FROM myhive.orders GROUP BY userid HAVING avg_money > 10000;
-- JOIN
-- JOIN订单表和用户表,找出用户名
SELECT
o.orderid,
o.userid,
u.username,
o.totalmoney,
o.useraddress,
o.paytime
FROM
myhive.orders o
JOIN myhive.users u ON
o.userid = u.userid;
-- 左外关联,订单表和用户表,找出用户名
SELECT
o.orderid,
o.userid,
u.username,
o.totalmoney,
o.useraddress,
o.paytime
FROM
myhive.orders o
LEFT JOIN myhive.users u ON
o.userid = u.userid;
-- RLIKE 正则匹配
-- Hive中提供RLIKE关键字,可以供用户使用正则和数据进行匹配。
-- 查找广东省的数据
SELECT * FROM myhive.orders WHERE useraddress RLIKE '.*广东.*';
-- 查找用户地址是:xx省 xx市 xx区的数据
SELECT * FROM myhive.orders WHERE useraddress RLIKE '..省 ..市 ..区';
-- 查找用户姓为张、王、邓
SELECT * FROM myhive.orders WHERE username RLIKE '[张王邓]\\S+';
-- 查找手机号符合:188****0*** 规则
SELECT * FROM myhive.orders WHERE userphone RLIKE '188\\S{4}0\\S{3}';
-- UNION联合
-- UNION 用于将多个 SELECT 语句的结果组合成单个结果集。
-- 每个 select 语句返回的列的数量和名称必须相同。否则,将引发架构错误。
-- 基础语法:
SELECT ...
UNION [ALL]
SELECT ...
-- 联合两个查询结果集
SELECT * FROM course WHERE t_id = '周杰轮'
UNION
SELECT * FROM course WHERE t_id = '王力鸿';
-- UNION默认有去重功能:
-- 直接联合两个同样的查询结果
SELECT * FROM course
UNION
SELECT * FROM course
-- 如果不需要去重效果
SELECT * FROM course
UNION ALL
SELECT * FROM course
-- UNION写在FROM中
SELECT t_id, COUNT(*) FROM
(
SELECT t_id FROM myhive.course WHERE t_id = '周杰轮'
UNION ALL
SELECT t_id FROM myhive.course WHERE t_id = '王力鸿'
) AS u GROUP BY t_id;
-- 用于INSERT SELECT中
CREATE TABLE myhive.course2 LIKE myhive.course;
INSERT OVERWRITE TABLE myhive.course2
SELECT * FROM myhive.course
UNION ALL
SELECT * FROM myhive.course;
-- 对表数据进行采样操作
-- Hive提供的快速抽样的语法,可以快速从大表中随机抽取一些数据供用户查看
-- TABLESAMPLE函数
-- 语法1,基于随机分桶抽样:
SELECT ... FROM tbl TABLESAMPLE(BUCKET x OUT OF y ON(colname | rand()))
-- y表示将表数据随机划分成y份(y个桶)
-- x表示从y里面取第X份数据作为取样
-- colname表示随机的依据基于某个列的值
-- rand()表示随机的依据基于整行
-- 示例:
SELECT username, orderId, totalmoney FROM myhive.orders TABLESAMPLE(BUCKET 1 OUT OF 10 ON username);
SELECT * FROM myhive.orders TABLESAMPLE(BUCKET 1 OUT OF 10 ON rand());
-- 注意:
-- 使用colname作为随机依据,则其它条件不变下,每次抽样结果一致
-- 使用rand()作为随机依据,每次抽样结果都不同
-- 语法2,基于数据块抽样
SELECT ... FROM tbl TABLESAMPLE(num ROWS | num PERCENT | num(K|M|G));
-- num ROWS 表示抽样num条数据
-- num PERCENT 表示抽样num百分百比例的数据
-- num(K|M|G) 表示抽取num大小的数据,单位可以是K、M、G表示KB、MB、GB
SELECT * FROM myhive.orders TABLESAMPLE(100 ROWS);
SELECT * FROM myhive.orders TABLESAMPLE(10 PERCENT);
SELECT * FROM myhive.orders TABLESAMPLE(100K);
-- 注意:
-- 使用这种语法抽样,条件不变的话,每一次抽样的结果都一致
-- 即无法做到随机,只是按照数据顺序从前向后取。
-- 虚拟列的使用方式
-- Virtual Columns虚拟列
-- 虚拟列是Hive内置的可以在查询语句中使用的特殊标记,可以查询数据本身的详细参数。
-- Hive目前可用3个虚拟列:
-- INPUT__FILE__NAME,显示数据行所在的具体文件
-- BLOCK__OFFSET__INSIDE__FILE,显示数据行所在文件的偏移量
-- ROW__OFFSET__INSIDE__BLOCK,显示数据所在HDFS块的偏移量,此虚拟列需要设置:SET hive.exec.rowoffset=true 才可使用
SET hive.exec.rowoffset=true;
-- 作用:
-- 使用虚拟列,可以让我们更精准的查看到具体每一条数据在存储上的详细参数细节
-- 虚拟列不仅仅可以用于SELECT,在WHERE、GROUP BY等均可使用
-- 示例:
SELECT *, INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, ROW__OFFSET__INSIDE__BLOCK FROM myhive.course;
-- 查询偏移量大于50的数据
SELECT *, BLOCK__OFFSET__INSIDE__FILE FROM course WHERE BLOCK__OFFSET__INSIDE__FILE > 50;
-- 统计分桶表中每个文件的数据量
SELECT INPUT__FILE__NAME, COUNT(*) FROM myhive.course GROUP BY INPUT__FILE__NAME;
函数
Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions):
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-MathematicalFunctions
-- 使用show functions查看当下可用的所有函数;
show functions;
-- 通过describe function extended funcname来查看函数的使用方式
describe function extended funcname
----Mathematical Functions 数学函数-------------
--取整函数: round 返回double类型的整数值部分 (遵循四舍五入)
select round(3.1415926);
--指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
select round(3.1415926,4);
--取随机数函数: rand 每次执行都不一样 返回一个0到1范围内的随机数
select rand();
--指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列
select rand(3);
--求数字的绝对值
select abs(-3);
--得到pi值(小数点后15位精度)
select pi();
-- Collection Functions集合函数 - 全部
-- Return Type Name(Signature) Description
int size(Map<K.V>) -- 返回map类型的元素个数
int size(Array<T>) -- 返回array类型的元素个数
array<K> map_keys(Map<K.V>) -- 返回map内的全部key(得到的是array)
array<V> map_values(Map<K.V>) -- 返回map内的全部value(得到的是array)
boolean array_contains(Array<T>, value) -- 如果array包含指定value,返回True
array<t> sort_array(Array<T>) -- 根据数组元素的自然顺序按升序对输入数组进行排序并返回它
-- Type Conversion Functions类型转换函数 - 全部
-- Return Type Name(Signature) Description
binary binary(string|binary) -- 将给定字符串转换为二进制
Expected "=" to follow "type" cast(expr as <type>)
-- 将表达式 expr 的结果转换为给定类型 。
-- 例如,cast('1' as BIGINT) 会将字符串 '1' 转换为整数表示。如果转换不成功,则返回 null。
-- 对于cast(expr as boolean),对于非空字符串将会返回True
-- Date Functions日期函数 - 部分
-- Return Type Name(Signature) Description
timestamp current_timestamp() -- 返回当前时间戳。在同一个查询中对 current _ time戳的所有调用都返回相同的值。
date current_date -- 返回当前日期。在同一个查询中对current_date ,戳的所有调用都返回相同的值。
2.1.0版本之前返回string,现在版本返回date to_date(string timestamp) -- 时间戳转日期
int year(string date) -- 得到给定时间的:年
quarter(date/timestamp/string) -- 得到给定时间的:季度
month(string date) -- 得到给定时间的:月
day(string date) -- 得到给定时间的:日
dayofmonth(date) -- 得到给定时间的:当前月份第几天
hour(string date) -- 得到给定时间的:小时
minute(string date) -- 得到给定时间的:分钟
second(string date) -- 得到给定时间的:秒
weekofyear(string date) -- 得到给定时间的:本年第几周
int datediff(string enddate, string startdate) -- 返回enddate 到 startdate之间的天数
date_add(date/timestamp/string startdate, tinyint/smallint/int days) -- 2.1.0版本之前返回string,现在版本返回date
date_sub(date/timestamp/string startdate, tinyint/smallint/int days) -- 2.1.0版本之前返回string,现在版本返回date
-- 日期相加: date_add('2008-12-31', 1) = '2009-01-01'.
-- 日期相减: date_sub('2008-12-31', 1) = '2008-12-30'.
条件函数、字符串函数、脱敏函数、其它函数的使用
-- Conditional Functions条件函数 - 全部
-- Return Type Name(Signature) Description
T if(boolean testCondition, T valueTrue, T valueFalseOrNull) -- 如果 testCondition 为 true,则返回 valueTrue,否则返回 valueFalseOrNull。
boolean isnull( a ) -- 如果 a 为 NULL,则返回 true,否则返回 false。
boolean isnotnull ( a ) -- 如果 a 不为 NULL,则返回 true,否则返回 false。
T nvl(T value, T default_value) -- 如果value为 null,则返回default_value,否则value。
T COALESCE(T v1, T v2, ...) -- 返回第一个不是 NULL 的 v,如果所有 v 都是 NULL,则返回 NULL。
T CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END -- 当 a = b 时,返回 c; [当 a = d 时,返回 e]* ;否则返回 f。
T CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END -- When a = true, returns b; when c = true, returns d; else returns e. a可以是表达式,如1=1
T nullif( a, b ) -- 如果 a=b,则返回 NULL;否则返回a 。等价:CASE WHEN a = b then NULL else a
void assert_true(boolean condition) -- 如果boolean_condition结果不为True,则引发异常报错,比如:select assert_true (2<1).
-- String Functions字符串函数 - 部分
-- Return Type Name(Signature) Description
string concat(string|binary A, string|binary B...) -- 连接字符串 For example, concat('foo', 'bar') results in 'foobar'
string concat_ws(string SEP, string A, string B...) -- 同concat,但是可以自己定义字符串之间的分隔符(SEP)
int length(string A) -- 字符串长度
string lower(string A) -- 全部转小写
string upper(string a) -- 全部转大写
string trim(string A) -- 返回从 A 的两端裁剪空格得到的字符串。例如,trim('foobar')的结果是'foobar'
array split(string str, string pat) -- 按照pat分隔字符串,pat是正则表达式
-- Data Masking Functions数据脱敏函数 - 部分
-- Return Type Name(Signature) Description
string mask_hash(string|char|varchar str) -- 对字符串进行hash加密,非字符串加密会得到NULL
-- Misc. Functions其它函数 - 部分
-- Return Type Name(Signature) Description
int hash(a1[, a2...])) -- 返回参数的hash数字
string current_user() -- 返回当前登录用户
string current_database() -- 返回当前选择的数据库
string version() -- 返回当前hive版本
string md5(string/binary) -- 返回给定参数的md5值