大家好,我是摇光~,用大白话讲解所有你难懂的知识点
我之前在学习 hadoop 和 hive 的关系后,就想整理一些hive 的知识点,所以这篇还是大白话来了解到 hivesql 。
本篇文章主要写Hive的基本操作,在进行Hive的学习前,我们来了解下hive的数据模型。
可以从上图看到,表是由一条条记录构成的,数据库由一个个表构成的,hive存储着一个个数据库。在公司里,基本一个业务条线一个数据库,这样便于数据库的管理。
数据库位置:
- 在hive中,默认的数据库叫做:default,存储数据位置位于 HDFS 的 /user/hive/warehouse下。
- 用户自己创建的数据库存储位置是 /user/hive/warehouse/database_name.db下。
有了上面的基础知识,我们就来了解一下 hive SQL 的语法。
一、DDL 数据定义语言
DDL是什么?
DDL是SQL语言集中对数据库内部的对象结构进行创建,删除,修改
等操作语言。
- 对象结构:数据库(database)、表(table)、视图(view)、索引(index)等
- DDL核心语法由 CREATE、ALTER、DROP 三个组成,
DDL并不涉及表内部数据的操作
下面来学习一些 DDL 的命令:
1、HiveSQL——数据库DDL
1、创建数据库
CREATE DATABASE IF NOT EXISTS mydatabase; -- mydatabase 是数据库的名字
create database mydatabase location '/myhive2'; -- 创建数据库并指定hdfs存储位置
2、删除数据库
DROP DATABASE IF EXISTS mydatabase; # 注意:mydatabase必须为空才能删除。
DROP DATABASE IF EXISTS mydatabase CASCADE; # 如果数据库有表,就需要使用 CASCADE。(谨慎使用!)
3、修改数据库
在Hive中,数据库更像是一个命名空间,它不能被重命名,如果需要修改数据库名字,可以创建一个新的数据库,并将旧数据库表导入新的数据库,再删除旧数据库
4、查看数据库信息
use database_name; -- database_name 是数据库的名字
desc database mydatabase; -- 查看数据库基本信息
desc database extended mydatabase; -- 查看数据库更多详细信息
2、HiveSQL——表DDL
1、 创建普通表(非常重要)
- 基本语法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS][db_name.]table_name
[(col_name data_type [COMMENT col_conmment],....)]
[COMMENT table_comment]
[ROW FORMAT DELIMITED]
上面的建表语句我们一句一句解析:
CREATE TABLE [IF NOT EXISTS][db_name.]table_name
# CREATE TABLE table_name 是必须要写的,table_name 是指表名字,尽量英文
# [EXTERNAL] 是指创建外部表,如果不写就是内部表。
# [db_name.] 是指数据库的名字,如果不写,就创建到默认数据库
# [IF NOT EXISTS] 是指如果不存在该表名的话,就创建
注意:内部表和外部表的区别:
内部表数据由Hive自身管理,外部表数据则由HDFS管理;
- 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定。
- 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
- 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name)。
[(col_name data_type [COMMENT col_conmment],....)]
# col_name 是字段名字,比如 name,age,尽量用英文名
# data_type 是字段的数据类型,比如 int、string
# COMMENT col_conmment 是字段的注释,比如 名字,年龄,尽量使用中文解释字段意思
[COMMENT table_comment]
# table_comment 表的注释,尽量使用中文解释表的名字
[ROW FORMAT DELIMITED]
# 表示数据之间的分隔符,含有四个值,根据自己所需选择(可多选)
# FIELDS TERMINATED BY char : 字段之间分隔符,比如 char 可以是',' 、'|'
# COLLECTION ITEMS TERMINATED BY ':' :集合元素之间分隔符,例如用 : 进行分割
# MAP KEYS TERMINATED BY '=':Map映射kv之间分隔符,映射键的分隔符,用于分隔映射中的键
# LINES TERMINATED BY '\n':行之间的分隔符 比如 :\n# FIELDS TERMINATED 默认分隔符是'\001',是一种特殊的字符,使用的是 ASCII编码,键盘打不出,编辑器打开的是 SOH
- 举个例子
比如数据文件长这样,每行数据字段用 “,” 分割,每行数据用换行符(‘\n’)分隔
上图的数据就可以使用下面的建表语句。
CREATE TABLE IF NOT EXISTS cus_info ( # 创建表id INT COMMENT '表ID', # 表字段和字段描述name STRING COMMENT '姓名',age INT
)
COMMENT '个人信息表' # 表的名字
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' # 字段数据之间采用 , 分隔
LINES TERMINATED BY '\n'; # 行之间采用 换行符 \n 进行分隔
注意:上述的文件数据的顺序和表的字段顺序必须一致。
这样就完成了建表语句,要想查询到数据,可以直接将文件放在这个表文件夹(/user/hive/warehouse)下,就可以直接查询数据了。
还有可以使用 hive 自带的加载数据逻辑进行数据加载。(第二章会讲到)
-- 举例:
create table if not exists cus_info(id int ,name string)
row format delimited
fields terminated by '\t'
stored as textfile -- stored as 指存储格式
location '/user/stu'; -- location 指存储位置
- 其他创建表方式
create table new_table as select * from cus_info; -- select * from cus_info 是查询出来的数据,然后将查询出来的创建到一个表中
create table stu4 like stu2; -- 根据已有表结构创建表
2、删除表
DROP TABLE IF EXISTS mytable; -- 删除表
truncate table mytable; -- 清空内部表;若清空外部表,会产生错误
3、修改表
ALTER TABLE mytable ADD COLUMNS (new_column INT,new_column2 string); # 新增表字段
ALTER TABLE mytable RENAME TO new_table_name; # 将表名字修改
4、查看表信息
show tables; -- 查看当前数据库下的所有表
desc cus_info; -- 只查询表内字段及属性
desc formatted cus_info; -- 详细查询
show tables in default; -- 查看 default 数据库下的所有表
desc formatted cus_info; -- 查看 cus_info 这张表的元数据信息
show create table cus_info; -- 查看表创建语句
这里插入一个小知识,如果在查看元数据信息的时候,出现中文注释乱码
,是因为存放元数据信息的 mysql 不支持中文编码,我们需要改一些配置。
# 注意:以下sql 在mysql 中执行(可以后台连接mysql执行下面语句),修改Hive存储的元数据信息
show databases;
use hive; # 注意要切换到hive使用的数据库alter table hive3.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table hive3.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table hive3.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;# 运行之后,之前的那些注释乱码的数据不会改过来,需要重新删除再创建表才行。
5、分区表
分区表:就是把
一张大表按照分区信息分成许多张小表
;这些小表可以存放在不同的存储位置,虽然这些表存储在不同位置,但是很多操作和普通表差不多。
分区的好处:
- 存储更多数据:与单个磁盘或文件系统分区相比,分区表可以存储更多的数据。
- 提高查询吞吐量:通过跨多个磁盘分散数据查询,获得更大的查询吞吐量。
- 并行处理:涉及聚合函数的查询可以更容易地进行并行处理,提升查询效率。
- 提升查询效率:某些查询可以优化,只需从某个或几个分区中获取数据。
- 便于管理:容易根据分区删除失去保护意义的历史数据。
我们来举个例子:
- 一个商场的销售信息,每天会产生很多数据,所以我们可以按天进行分区。这样可以存储更多的信息,然后还可以在查询计算的时候,进行分区计算再合并,这样查询和计算的时间就会更快。
- 所以很多大表(数据量比较大)适合使用分区表。
分区表在查询、函数计算其实和普通表没什么大的差别,主要在于数据插入和删除,需要带入分区信息。
-- 创建销售分区表
create table sale(product string, amount int) partitioned by (month string); -- 创建多个分区信息
create table sale(product string, amount int) partitioned by (year string,month string); show partitions sale; -- 查看分区
alter table sale drop partition(month = '202401'); -- 删除分区
alter table sale add partition(month='202401'); -- 添加单个分区
alter table sale add partition(month='202401') partition(month = '202402'); -- 添加多个分区
二、DML 数据操纵语言
在学习完 DDL 后,我们知道怎么去创建、删除、修改 表 和数据库了,接下来我们将学习怎么插入数据、更新数据等操作。
DML是Data Manipulation Language的缩写,意思是数据操纵语言。
- 是指在SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。
由于hive它主要用来进行海量数据的提取、转化、加载,所以在Hive中的UPDATE、DELETE相关操作使用的场景比较少。
1、DML-加载数据
做数据分析肯定离不开数据,那数据是怎么加载进来的呢?
在DDL章节,我们就学到了创建表之后,只需要将数据文件放入 /user/hive/warehouse 文件夹下对应的表文件夹内,就可以查询到数据了。
但是这种简单粗暴的方法,其实不怎么推荐,毕竟不怎么规范,所以官方出了 Load 方法进行加载。接下来让我们看看怎么去加载数据。
① Hive SQL Load 加载数据(官方推荐)
- Load语法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
这里的 LOCAL 参数值得注意下:
- 如果加上 local ,就是指 从
本地文件系统(Hiveserver2服务所在及其的本地Linux文件系统)
复制文件- 如果不加 local,表示从 hdfs 文件系统 移动 文件
这里一定要理解 local 的含义,加local是Hiveserver2服务所在的文件系统,不加就是hdfs;然后还要区别是复制还是移动。
其实上面的操作本质
就是:将数据文件移动或复制到hive表对应的位置。
1、加载普通表
- 例子
# 1、使用load data local,将数据文件复制到hive表对应位置,这里的local 是指Hiveserver2服务所在的本地# 追加表数据
load data local inpath '/root/localdatas/cus_info.txt' into table mydatabase.local_cus_info; # 覆盖表数据
load data local inpath '/root/localdatas/cus_info.txt' overwrite into table mydatabase.local_cus_info;
# 2、使用load data ,将数据文件移动到 hive 表对应位置,注意是使用hdfs文件系统# 追加表数据
load data inpath '/mydatas/cus_info.txt' into table mydatabase.hdfs_cus_info;# 覆盖表数据
load data inpath '/mydatas/cus_info.txt' overwrite into table mydatabase.local_cus_info;
2、加载分区表数据
-- 加载数据到分区表
load data local inpath '/export/hivedatas/sale.csv' into table sale partition (month='201806'); -- 加载多个分区信息到表中
load data local inpath '/export/hivedatas/sale.csv' into table sale partition(year='2018',month='06');
② Hive SQL Insert 加载数据(非常慢)
在上面我们已经学到用 Load 加载文件,进行数据插入;其实还可以通过 Insert 进行数据插入。
- 语法
insert into table cus_info values(1,'张思',23);
上面这种插入的方法,非常的慢,因为hive的机制是先转成 MR 计算,再进行操作。(可以在YARN上查看进程)所以导致这种方法非常慢。
虽然非常慢,但是insert 搭配 select 可以将查询出来的数据插入到表中。
- 语法
insert into table cust_info select id,name,age from cust_info_old;
这种方法虽然可以将查询出来的数据插入表中,但是需要注意的是字段必须相对应。
- 语法
# 查询方式加载分区数据
insert overwrite table sale partition(month = '201806') select product,amount from sale1;
2、导出数据
-- 将查询的结果导出到本地
insert overwrite local directory '/export/exporthive' select * from sale;-- 将查询的结果格式化导出到本地
insert overwrite local directory '/export/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from sale;-- 将查询的结果导出到HDFS上(没有local)
insert overwrite directory '/export/exporthive' row format delimited fields terminated by '\t' collection items terminated by '#' select * from sale;
由于hive是基于数据仓库建设,所以不支持传统意义的updata和delete,所以我们在这就不学习了。
三、DQL 数据查询语言
上面我们学习了两种数据插入的方法,接下来我们学习重要的数据查询。
- select语法树
SELECT [ALL | DISTINCT] select_expr, select_expr, ... # 这里写字段名
FROM table_reference # 表名
[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] # 限制
1、查询列名
- 查询表
select * from cus_info; # 查询表所有字段
select id,name from cus_info; # 查询字段 id,name 数据
select 1 from cus_info; # 查询常量,和表字段无关
select current_database(); # 查询当前数据库 - 函数运用select all name from cus_info; # 展示这行所有信息,重复的也展示;相当于 select name from cus_info
select distinct name from cus_info; # 去除重复数据
select distinct id,name from cus_info; # 去除两列 id,name 重复数据
2、where 条件使用
where 起到一个过滤的作用,where后面是一个布尔表达式,结果要么为true,要么为false;当为true时,就返回select 后面的表达式内容,否则为空。
where 表达式中,可以使用Hive支持的任何函数和运算符(>、<、=、and 、or等等),但聚合函数除外。
- 1、where 普通表达式
select * from cus_info where 1>2; # 所有都不满足 1>2 ,所以返回是空表
select * from cus_info where 1=1; # 所有都满足 1=1,返回全表。
- 2、where后面跟比较运算
# 比较运算符:> , < , >= , <= , = , !=,<>
select * from cus_info where name = '张三'; # 查询name叫 张三的数据。
select * from cus_info where age > 20; # 查询 age 超过 20的人
- 3、where后面跟比较、逻辑运算符
# 比较运算符:> , < , >= , <= , = , !=,<>
# 逻辑运算符:and or
select * from cus_info where name = '张三' and age = 10; # 查询name叫 张三且age = 10 的数据。
- 4、where后面跟特殊条件
# 1、空值判断 is null
select * from cus_info where name is null; # 查询name为空的数据。# 2、between and:两者之间的数据
select * from cus_info where age between 10 and 20; # 查询age在 10 到 20 之间的数据。# 3、in 含有这些值的数据
select * from cus_info where name in ('张三','李四'); # 查询in括号里面的数据。# 4、字符串like
select * from cus_info where name like '%三'; # 查询in括号里面的数据。
3、聚合函数
- 语法
select function(列) from table_name; # 这里的 function 就是聚合函数
聚合函数的特点:不管原始数据有多少行记录,经聚合操作只返回一条数据,这条数据就是聚合的结果。
聚合函数:
- age(column):返回某列的平均值
- count(*):返回表的行数,包含空值
- count(column):返回某列的行数(不包含NULL值)
- count(distinct column):返回去重后某列的行数(不包括NULL值)
- max(column):返回某列的最高值,不包含空值
- min(column):返回某列的最低值,不包含空值
- sum(column):返回某列的总和,不包含空值
- 举例
select count(*) from cus_info; # 返回 cus_info 的行数
select max(age) from cus_info; # 返回 age 年龄最大的数据
4、Group by 分组 和 hiving 子句
group by 总是和 聚合函数 一起使用,将数据分组再统计。
以下是数据:
我们通过实例来展示 group by 的用法
# 对 sex 进行分类统计对score求和
select sex,sum(score) from cus_info group by sex;# 对 sex 进行分类统计:count统计行数,对score求和
select sex,count(sscore),sum(score) from cus_info group by sex;# 对 sex,grade 进行分类统计:count统计行数,对score求和
select sex,grade,count(sscore),sum(score) from cus_info group by sex,grade;
因为 where 里面没办法进行聚合函数,所以可以使用having 对聚合数据进行筛选
。
执行的顺序是:
先 where 过滤,再 group by 分组,再进行 having 对分组后数据过滤。
# 1、先进行where过滤 sex = 'M' 数据
# 2、再用 grade 进行分组,sum(score)
# 3、最后having后面接对聚合函数结果的筛选,sum(score) > 200
select grade,sum(score) from cus_info where sex = 'M' group by grade having sum(score) > 200;# 可以重命名 AS s ,再进行 s > 200
select grade,sum(score) AS s from cus_info where sex = 'M' group by grade having s > 200;
6、排序
- 1、order by排序
order by 可以对指定的列进行排序,默认升序(ASC),降序DESC
select * from cus_info order by score ; # 默认升序
select * from cus_info order by score DESC; # score 字段降序排序select * from cus_info order by sex,score DESC; # 先进行sex,再进行score 字段降序排序
- 2、sort by 局部排序
sort by :用于在每个Reducer的输出分区内进行局部排序。它会在数据进入Reducer之前完成排序,确保每个Reducer的输出是有序的,但不会保证全局有序。
set mapreduce.job.reduces=3; -- 设置reduce个数
set mapreduce.job.reduces; -- 查看设置reduce个数
select * from sale sort by amount; -- 查询产品按照产品数量降序排列-- 将查询结果导入到文件中(按照成绩降序排列)
insert overwrite local directory '/export/hivedatas/sort' select * from sale sort by amount;
- 3、分区排序
distribute by:类似MR中partition,进行分区,结合sort by使用
set mapreduce.job.reduces=7; # 设置reduce的个数,将我们对应的s_id划分到对应的reduce当中去
select * from sale distribute by product sort by amount; # 通过distribute by 进行数据的分区
7、limit
limit 用于限制select语句返回的行数。
select * from cus_info limit 10; # 返回 前十行数据
select * from cus_info limit 6,10; # 返回从第6行开始的 后 10 行数据
8、执行顺序
执行顺序:from > where >group by > group by 聚合函数 > having > order > select
聚合函数优先级:sum、min、max、avg、count
三、join 连接
1、inner join(join)
2、left join (left outer join)
四、hive 函数
学习了很多查询的语句,很多时候我们并不想只看数据,还想看一些统计数据;所以hive 内建了很多函数,正确的使用函数,可以提高sql编写效率。
show functions; # 查看当前的hive 中有哪些函数
describe function extended sum; # 描述 sum 函数的具体用法
1、内置函数
(1)、数学函数
select round(3.1415926); # 返回整数值部分(遵循四舍五入)
select round(3.1242341,4); # 返回指定精度的double 类型
select rand(); # 随机数函数,返回一个0-1之间的随机数
select rand(3); # 得到一个稳定的随机数序列 select ceil(3.1) ; # 向上取整
select floor(4.8); # 向下取整select log10(100); # 以10为底的对数函数
select pow(2,4); # 返回2的4次幂
select exp(2); # 自然指数
select sqrt(16); # 16 的平方根
select bin(7); # 7 的二进制
-- 绝对值函数: abs()、正取余函数: pmod()、正弦函数: sin()
-- 反正弦函数: asin()、余弦函数: cos()、反余弦函数: acos()
-- positive函数: positive()、negative函数: negative()
(2)、日期类型函数
- 获取日期数据
select current_date(); # 查看当前日期
select unix_timestamp(); # 查看当前时间戳select year('2021-03-28 10:03:01') from tableName; # 获取年
select month('2020-12-28 12:03:01') from tableName; # 获取月
select day('2020-12-08 10:03:01') from tableName; # 获取天
select hour('2020-12-08 10:03:01') from tableName; # 获取小时
select minute('2020-12-08 10:03:01') from tableName; # 获取分钟
select second('2020-12-08 10:03:01') from tableName; # 获取秒
select weekofyear('2020-12-08 10:03:01') from tableName; # 获取周
- 转换日期格式
select unix_timestamp('2024-11-30 12:34:12') # 将日期转换成 时间戳
select unix_timestamp('2021130 12:34:23','yyyyMMdd HH:mm:ss') # 指定格式日期赚UNIX时间戳函数select from_unixtime(12341223); # UNIX时间戳转成日期函数
select from_unixtime(1231,'yyyy-MM-dd HH:mm:ss'); # UNIX时间戳转成日期函数
- 加减日期
select datediff('2024-12-23','2022-11-11'); # 求两个日期之间的天数
select date_add('2022-2-3',20); # 将日期加 20 天
select date_sub('2023-5-12',50); # 将日期减 50 天
(3)、字符串类型函数
- 正常字符串函数
select length("hello"); # 5 求 'hello' 字符的长度
select reverse("hello"); # olleh 将数据进行翻转
select concat('hello','world'); # helloworld 将数据合并
select concat_ws('_','hello',array('world','!')); # hello_world_! 第一个参数是分隔符,进行数据合并select upper('abSEd') from tableName; # 转大写
select ucase('abSEd') from tableName; # 转大写
select lower('abSEd') from tableName; # 转小写
select lcase('abSEd') from tableName; # 转小写select trim(' abc ') from tableName; # 两边去空格
select ltrim(' abc ') from tableName; # 左边去空格
select rtrim(' abc ') from tableName; # 右边去空格select substr('hello',2,3); # ell 从第2位开始,截取3位数据
select substr('hello',-2); # hell 从倒数第二位开始截取数据
select split('hello_world','_'); # ["hello","world"] 按指定字符分割,返回一个数组
select split('hello_world','_')[0]; # hello 通过数组下标取得数据,索引从 0 开始select replace('atguigu', 'a', 'A') # 字符串替换
select regexp_replace('100-200', '(\\d+)', 'num') # 正则替换
select repeat('123', 3); # 123123123 重复字符串
- 补足函数
-- 左补足
select lpad('abc',10,'EW') from tableName; # 返回 EWEWEWEabc 使用 EW 补足 abc 左边缺失的,最终字符长度为10-- 右补足
select rpad('abc',10,'EW') from tableName; # 返回 abcEWEWEWE
- URL解析函数:parse_url
-- 语法: parse_url(string urlString, string partToExtract [, string keyToExtract])
-- 说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.-- 返回 HOST 信息 www.tableName.com
select parse_url('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST')
from tableName; -- 返回 QUERY 信息 v1
select parse_url('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1')from tableName;
- json解析函数:get_json_object
-- 语法: get_json_object(string json_string, string path)
-- 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
select get_json_object('{"store1":{"fruit1":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], "bicycle1":{"price":19.95,"color":"red"} },"email1":"amy@only_for_json_udf_test.net","owner":"amy"}','$.owner') from tableName;
(4)、集合函数
- map集合
# 创建map集合,map (key1, value1, key2, value2, …)
Create table mapTable as select map('A',10,'B',20) as t from tableName;select map_keys(map('A',10,'B',20)); # ["A","B"] 返回map中的 key
select map_values(map('A',10,'B',20)); # [10,20] 返回map中的 values# 访问数据
select t['A'],t['B'] from mapTable;
- array集合
# ["1","2","3"] 创建 array 集合
create table arr_table2 as select array("1","2","3") as t from tableName; select t[0],t[1] from arr_table2; # 访问数据
select array_contains(t,'2') from arr_table2; # 判断集合 ["1","2","3"] 是否有 "2"
select sort_array(t) from arr_table2; # [1,2,3] 将集合中元素进行排序
- 结构体
# 创建结构体
create table struct_table as select struct('name','age','sex') as t from tableName;
select t.col1,t.col3 from struct_table ; # 访问数据create table struct_table as select struct('name','Amy','age',23,'sex','F') as t from tableName;
select t.name,t.age from struct_table ; # 访问数据
(5)、条件函数
select if(1=2,'True','False'); # 1=2 是条件,如果条件成立返回第一个值,不成立返回第二个值
select if(sex='M','男','女') from cus_info ;select case when grade < 60 then '不及格'when grade < 80 then '良好'when grade > 80 then '优秀'else '其他'end as '等级'
from cus_info # 对 grade 多级判断
(6)、类型转换函数
SELECT CAST(column_name AS INT) FROM table_name;
# CAST(... AS BOOLEAN): 转换为布尔类型。
# CAST(... AS TINYINT): 转换为字节类型。
# CAST(... AS SMALLINT): 转换为短整型。
# CAST(... AS INT): 转换为整型。
# CAST(... AS BIGINT): 转换为长整型。
# CAST(... AS FLOAT): 转换为浮点型。
# CAST(... AS DOUBLE): 转换为双精度浮点型。
# CAST(... AS STRING): 转换为字符串类型。
# CAST(... AS BINARY): 转换为二进制类型。
# CAST(... AS TIMESTAMP): 转换为时间戳类型。
# CAST(... AS DATE): 转换为日期类型。
# CAST(... AS DECIMAL): 转换为十进制类型。
# CAST(... AS VARCHAR): 转换为可变长度的字符串类型。
# CAST(... AS CHAR): 转换为定长字符串类型。
(7)、数据脱敏函数
# 使用正则表达式进行数据脱敏
SELECT regexp_replace('1234567890', '\\d{5}(\\d{2})', '****') FROM dual;
(8)、聚合函数
- 语法
select function(列) from table_name; # 这里的 function 就是聚合函数
聚合函数的特点:不管原始数据有多少行记录,经聚合操作只返回一条数据,这条数据就是聚合的结果。
聚合函数:
- age(column):返回某列的平均值
- count(*):返回表的行数,包含空值
- count(column):返回某列的行数(不包含NULL值)
- count(distinct column):返回去重后某列的行数(不包括NULL值)
- max(column):返回某列的最高值,不包含空值
- min(column):返回某列的最低值,不包含空值
- sum(column):返回某列的总和,不包含空值
2、用户定义函数
(1)UDF函数
- UDF函数:普通函数,一进一出
(2)UDAF 函数
- UDAF函数:聚合函数,多进一出
(3)UDTF 函数
对UDTF函数的讲解,我有写一篇专门的文章进行讲解:
hive UDTF Lateral view expload 详细讲解
以上就是 hivesql 的一些知识,如果有什么不对的地方,欢迎大家指正。
还想了解什么大数据知识,可以私信我或者评论区告诉我~
我会竭尽全力用大白话讲解你们难懂的知识。