Hive的基础函数

news/2024/11/28 4:24:30/

字符串函数

-- lower(转小写)
select lower('ABC');
--upper(转大写)
select upper('abc');
--length(字符串长度,字符数)
select length('abc');
-- concat(字符串拼接)
select concat("A", 'B');
-- concat_ws(指定分隔符)
select concat_ws('-','a' ,'b','c');
-- substr(求子串)
select substr('abcde',3);
-- split(str,regex) 切分字符串,返回数组 
select split("a-b-c-d-e-f","-");
select concat_ws('&',split('a,b,c,d,f',','));
select replace('a,b,c,d,f',',','&');以下这个函数不是字符串函数:
select explode(split('h-e-l-l-o','-'));

类型转换函数

--round 四舍五入((42.3 =>42))
select round(42.3);
--ceil 向上取整(42.3 =>43)
select ceil(42.3);
--floor 向下取整(42.3 =>42)
select floor(42.3);
-- 求绝对值
select abs(-1);
-- 取模函数

hive的其他函数

1)nvl 判断一个数值是否为null,如果为null,给一个默认值

select nvl(null,100);select nvl(200,100);select nvl(comm,0)+sal from emp;

2) 函数case when then ....when ...then.. else... end

举例说明:
数据如下:
张三	A	男
李四	A	男
王五	B	男
赵六	A	女
琪琪	B	女
巴巴	B	女
求男女数量。
建表:
create table emp_sex(
name string, 
dept_id string, 
sex string) 
row format delimited fields terminated by "\t";导入数据:
load data local inpath '/home/hivedata/test_a.txt' into table emp_sex;sql 编写:
select sex,count(1) from emp_sex group by sex;还有其他写法:
select  sum(case when sex='男' then 1 else 0 end) as `男`,sum(case when sex='女' then 1 else 0 end) as `女`
from emp_sex;还可以使用类似于switch的写法:
select  sum(case sex when '男' then 1 else 0 end) as man ,sum(case sex when '女' then 1 else 0 end) as women
from emp_sex;

hive中的字段的别名,英文别名不要使用单引号或者双引号,直接写就行,如果是中文的别名需要添加反引号``

3)get_json_object 从json数据中获取值

select get_json_object('{"name":"jack","age":19}','$.age');

4) parse_url 解析一个字符串中的url参数

举例: 获取url中的HOST
hive (yhdb)> select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','HOST');
OK
www.baidu.com
Time taken: 0.437 seconds, Fetched: 1 row(s)
-- 获取PROTOCOL中的协议
hive (yhdb)> select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','PROTOCOL');
-- 获取Path
OK
http
Time taken: 0.194 seconds, Fetched: 1 row(s)
hive (yhdb)> select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','PATH');
OK
/path1/path2
Time taken: 0.183 seconds, Fetched: 1 row(s)// 区分大小写
hive (yhdb)> select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','path');
OK
_c0
NULL
获取url后面的参数以及参数的值
select parse_url('http://www.baidu.com/path1/parth2?name=zhangsan&age=18','QUERY');
select parse_url('http://www.baidu.com/path1/parth2?name=zhangsan&age=18','QUERY','name');

5)if(p1,p2,p3)

语法格式:
if和case差不多,都是处理单个列的查询结果
语法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
返回值: T
e.g.
select if(1==1,1,2) ;
select if(name!='a',name,'aaa') from user01;
select source,if(source='猎聘',1,2) as flag from t_cal_dowell_resume;拓展:以下三个一个效果
select sal,if(comm is null,0,comm) from emp;
select sal,nvl(comm,0) from emp;
select sal,case when comm is null then 0 else comm end from emp;

6) coalesce(col1,col2,col3...)返回第一个不为空的数据

select coalesce(null,1,23,4);
返回结果为1

7)取模函数

select pmod(3,2);  -- 1select pmod(5,3); -- 2
-- b + am == -5+ m * 3 ==m=2  1 / 3
-- -7 + a * 3= 正数  a=3  2/3= 2
-- 假如第一个值是负数,一般采用公式 a + bm = xxx
-- a= 被除数  m 等于除数  b等于多少取决于 这个公式什么时候是正数,最后将正数 除以 除数 获得的余数就是结果
select pmod(-5,3); -- 1
select pmod(-7,3);

8) arry_contains

arry_contains()作用:判断数组是否包含某元素

语法:array_contains(数组,值),返回布尔类型

第五题:
有如下数据,表示1、2、3三名学生选修了a、b、c、d、e、f中的若干课程
id  course
1   a
1   b
1   c
1   e
2   a
2   c
2   d
2   f
3   a
3   b
3   c
3   e
根据如上数据,查询出如下结果,其中1表示选修,0表示未选修
id  a  b  c  d  e  f
1   1  1  1  0  1  0
2   1  0  1  1  0  1
3   1  1  1  0  1  0SQL:
--第一种方法
select id,sum(case when course='a' then 1 else 0 end ) a,sum(case when course='b' then 1 else 0 end ) b,sum(case when course='c' then 1 else 0 end ) c,sum(case when course='d' then 1 else 0 end ) d,sum(case when course='e' then 1 else 0 end ) e,sum(case when course='f' then 1 else 0 end ) ffrom zhoukao03 group by id;
--第二种方法
select id,if(array_contains(collect_set(course),'a'),1,0) a,if(array_contains(collect_set(course),'b'),1,0) b,if(array_contains(collect_set(course),'c'),1,0) c,if(array_contains(collect_set(course),'d'),1,0) d,if(array_contains(collect_set(course),'e'),1,0) e,if(array_contains(collect_set(course),'f'),1,0) ffrom courses group by id;假如查询出如下结果id     a        b          c         d            e            f
1   选修  选修      选修   未选修    选修      未选修
2   选修  未选修  选修    选修      未选修   选修
3   选修  选修     选修    未选修    选修      未选修create  table courses (
id  int,
course string
)
row format delimited
fields terminated by '\t';load data local inpath '/home/hivedata/zuoye5.txt' into table courses;select id,if(array_contains(collect_set(course),'a'),'选修','未选修') a,if(array_contains(collect_set(course),'b'),'选修','未选修') b,if(array_contains(collect_set(course),'c'),'选修','未选修') c,if(array_contains(collect_set(course),'d'),'选修','未选修') d,if(array_contains(collect_set(course),'e'),'选修','未选修') e,if(array_contains(collect_set(course),'f'),'选修','未选修') ffrom courses group by id;


http://www.ppmy.cn/news/1550528.html

相关文章

Python数据分析实例五、US 大选捐款数据分析

美国联邦选举委员会 (FEC) 公布了对政治竞选活动的贡献数据。这包括投稿人姓名、职业和雇主、地址和投款金额。2012 年美国总统大选的贡献数据以单个 150 MB 的 CSV 文件P00000001-ALL.csv形式提供,该文件可以通过以下pandas.read_csv加载: import pandas as pdfec = pd.r…

【Vue3】vue3有哪些方法和工具可以将参数变为响应式或处理响应式数据

在 Vue 3 中,有多种方法和工具可以将参数变为响应式或处理响应式数据。 一、将参数变为响应式的方法 reactive: 将一个普通对象转换为响应式对象。 import { reactive } from vue; const state reactive({ count: 0 });readonly: 创建一个只…

Spring Cloud服务拆分和使用RestTemplate远程调用

任何分布式架构都离不开服务的拆分,微服务也是一样。 2.1.服务拆分原则 这里我总结了微服务拆分时的几个原则: 单一职责原则:每个微服务应负责单一的业务功能,避免服务过于复杂或承担过多职责。这有助于降低服务间的耦合度&…

Nvidia 推出最新 AI 音频模型,可制作前所未有的声音

英伟达新发布的“Fugatto”模型能够通过创新的合成方法和推理技术,生成各种从未存在过的声音,包括混合音乐、语音和其他声音。虽然模型尚未公开测试,但其展示了许多独特的音频效果,展示了其潜力。 数据决定成败 在一篇解释性研究…

小程序-基于java+SpringBoot+Vue的网上花店微信小程序设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

LangChain——HTML文本分割 多种文本分割

Text Splitters 文本分割器 加载文档后,您通常会想要对其进行转换以更好地适合您的应用程序。最简单的例子是,您可能希望将长文档分割成更小的块,以适合模型的上下文窗口。 LangChain 有许多内置的文档转换器,可以轻松地拆分、组…

Java、Android引用类型

Java/Android中有四种引用类型,分别是: Strong reference - 强引用 Soft Reference - 软引用 Weak Reference - 弱引用 Phantom Reference - 虚引用 不同的引用类型有着不同的特性,同时也对应着不同的使用场景。 Strong reference - 强引用…

Windows 系统上构建 Linux 应用

Red Hat 和 Microsoft 共同宣布,Red Hat Enterprise Linux(RHEL)即将成为微软 Windows Subsystem for Linux(WSL)的官方 Linux 发行版。 在 Windows 系统上构建 Linux 应用,然后在 RHEL 环境中部署的开发人…