各人好,我是摇光~,用大白话讲解所有你难懂的知识点
我之前在学习 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 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 [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等等),但聚合函数除外。
- select * from cus_info where 1>2; # 所有都不满足 1>2 ,所以返回是空表
- select * from cus_info where 1=1; # 所有都满足 1=1,返回全表。
复制代码
- # 比较运算符:> , < , >= , <= , = , !=,<>
- select * from cus_info where name = '张三'; # 查询name叫 张三的数据。
- select * from cus_info where age > 20; # 查询 age 超过 20的人
复制代码
- # 比较运算符:> , < , >= , <= , = , !=,<>
- # 逻辑运算符:and or
- select * from cus_info where name = '张三' and age = 10; # 查询name叫 张三且age = 10 的数据。
复制代码
- # 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、排序
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 字段降序排序
复制代码
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;
复制代码
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
复制代码
- -- 语法: 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;
复制代码
- -- 语法: 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 (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;
复制代码
- # ["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函数
(2)UDAF 函数
(3)UDTF 函数
对UDTF函数的讲解,我有写一篇专门的文章举行讲解:
hive UDTF Lateral view expload 详细讲解
以上就是 hivesql 的一些知识,如果有什么不对的地方,欢迎各人指正。
还想了解什么大数据知识,可以私信我大概评论区告诉我~
我会竭尽全力用大白话讲解你们难懂的知识。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |