Hive内置表生成函数

Hive内置UDTF

    • 1、UDF、UDAF、UDTF简介
    • 2、Hive内置UDTF


1、UDF、UDAF、UDTF简介


在Hive中,所有的运算符和用户定义函数,包括用户定义的和内置的,统称为UDF(User-Defined Functions)。如下图所示:

在这里插入图片描述

UDF官方文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

其中,用户自定义聚合函数和内置聚合函数统称为UDAF(User-Defined Aggregate Functions),用户自定义表生成函数和内置表生成函数统称为UDTF(User-Defined Table-Generating Functions)

本文将主要通过具体案例详细介绍Hive的内置表生成函数(UDTF)

2、Hive内置UDTF


Hive内置UDTF官方文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inTable-GeneratingFunctions%28UDTF%29

2.1、explode(array/map)

功能:列转行

示例:

select explode(array(1,2,3))
select explode(split('1,2,3', ','))

'''
col
1
2
3
'''
select explode(map(1,2,3,4))

'''
key	value
1	2
3	4
'''

2.2、posexplode(array)

功能:列转行,第一列添加元素索引(从0开始)

示例:

select posexplode(array(1,2,3))

'''
pos	val
0	1
1	2
2	3
'''

2.3、stack(n,v1,v2,…,vk)

功能:将k个数据平均转换成n行,即k/n列,k必须是n的整数倍,空值使用NULL

示例:

-- 将9个元素按顺序分成3行3列
with user_log as (
    select stack (
        3,
        '1001', '2021-12-12', 123,
        '1002', '2021-12-12', 145,
        '1001', '2021-12-13', 143
    )
    as (id, dt, lowcarbon)
)
select * from user_log

'''
user_log.id	user_log.dt	user_log.lowcarbon
1001	     2021-12-12	               123
1002	     2021-12-12	               145
1001	     2021-12-13	               143
'''

2.4、lateral view UDTF

功能:UDTF只允许在SELECT后面跟UDTF,不允许在SELECT后跟其他字段,例如:

select 'CN' as country,explode(array(1,2,3))

Hive报错,SparkSQL不报错。lateral view可以解决这个问题

示例1:字符串分割

-- 方式1
with shop as (
    select '1001' as pid,'1,2,3' as svs
    union 
    select '1002' as pid,'4,5,' as svs
)
select pid,svs,sv from shop
lateral view outer explode(split(svs, ',')) tmp_v as sv

-- 方式2
select pid,svs,sv from (
    select * from (
        select '1001' as pid,'1,2,3' as svs
        union 
        select '1002' as pid,'4,5,' as svs
    ) tmp
) shop
lateral view outer explode(split(svs, ',')) tmp_v as sv

'''
pid  	svs	   sv
1001	1,2,3	1
1001	1,2,3	2
1001	1,2,3	3
1002	4,5,	4
1002	4,5,	5
1002	4,5,	
'''

方式1和方式2使用lateral viewlateral view outer效果相同,空缺值显示为空字符串''

示例2:数组

-- 方式1
with shop as (
    select '1001' as pid,array(1,2,3) as svs
    union 
    select '1002' as pid,array(4,5,NULL) as svs
)
select pid,svs,sv from shop
lateral view outer explode(svs) tmp_v as sv

-- 方式2
select pid,svs,sv from (
    select * from (
        select '1001' as pid,array(1,2,3) as svs
        union 
        select '1002' as pid,array(4,5,NULL) as svs
    ) tmp
) shop
lateral view outer explode(svs) tmp_v as sv

'''
pid	    svs	       sv
1001	[1,2,3]	    1
1001	[1,2,3]	    2
1001	[1,2,3]	    3
1002	[4,5,null]	4
1002	[4,5,null]	5
1002	[4,5,null]	NULL
'''

方式1和方式2使用lateral viewlateral view outer效果相同,空缺值显示为NULL

示例3:数据存在NULL

-- 方式1
with shop as (
    select '1001' as pid, '1,2,3' as svs
    union 
    select '1002' as pid, NULL as svs
)
select pid,svs,sv from shop
lateral view outer explode(split(svs, ',')) tmp_v as sv

-- 方式2
select pid,svs,sv from (
    select * from (
        select '1001' as pid, '1,2,3' as svs
        union 
        select '1002' as pid, NULL as svs
    ) tmp
) shop
lateral view outer explode(split(svs, ',')) tmp_v as sv

-- lateral view结果:
'''
pid	    svs	   sv
1001	1,2,3	1
1001	1,2,3	2
1001	1,2,3	3
'''
-- lateral view outer结果:
'''
pid	    svs	   sv
1001	1,2,3	1
1001	1,2,3	2
1001	1,2,3	3
1002	NULL	NULL
'''

方式1和方式2使用lateral viewlateral view outer效果不同,lateral view空缺值数据丢失,lateral view outer空缺值显示为NULL

lateral view [outer]详解见文章:传送门

2.5、json_tuple(json_str,k1,k2,…)

功能:从json字符串中根据key获取对应的value返回

示例:json_tuple()使用见文章:传送门

2.6、parse_url_tuple(url,p1,p2,…)

功能:从url中根据属性property获取对应的value返回

示例:

select parse_url_tuple('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST', 'PATH', 'QUERY', 'REF', 'PROTOCOL', 'QUERY:k1', 'QUERY:k2')

'''
c0	            c1	            c2	        c3	    c4	    c5	c6
facebook.com	/path1/p.php	k1=v1&k2=v2	Ref1	http	v1	v2
'''

参数详解见:https://help.aliyun.com/zh/maxcompute/user-guide/parse-url-tuple

2.7、inline(array<struct>)

功能:将结构体数组并列分解为多行

示例:

select inline(array(struct('A',18,date '2023-10-01'),struct('B',20,date '2023-11-01'))) as (col1,col2,col3)

'''
col1  col2	      col3
A	   18	2023-10-01
B	   20	2023-11-01
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/186833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot学生疫情管理系统-计算机毕设 附源码 25567

Springboot学生疫情管理系统的设计与实现 摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xf…

Dubbo配置注册中心设置application的name使用驼峰命名法可能存在的隐藏启动异常问题

原创/朱季谦 首先&#xff0c;先提一个建议&#xff0c;在SpringBootDubbo项目中&#xff0c;Dubbo配置注册中心设置的application命名name的值&#xff0c;最好使用xxx-xxx-xxx这样格式的&#xff0c;避免随便使用驼峰命名。因为使用驼峰命名法&#xff0c;在Spring的IOC容器…

数据结构总复习

文章目录 线性表动态分配的顺序存储结构链式存储 线性表 动态分配的顺序存储结构 通过分析代码&#xff0c;我们发现&#xff0c;要注意什么&#xff1a; 要分清你的下标Insert 函数是可以用来没有元素的时候&#xff0c;增加元素的Init(或者Create )函数一般只用来分配空间…

Python中如何选择Web开发框架?

Python开发中Web框架可谓是百花齐放&#xff0c;各式各样的web框架层出不穷&#xff0c;那么对于需要进行Python开发的我们来说&#xff0c;如何选择web框架也就变成了一门学问了。本篇文章主要是介绍目前一些比较有特点受欢迎的Web框架&#xff0c;我们可以根据各个Web框架的特…

在线定制印刷系统源码/定制云印刷/个性印刷在线DIY定制商城系统/全站DIV+CSS 布局+手机、PC端

源码简介&#xff1a; 在线定制印刷系统源码/定制云印刷&#xff0c;它是个性印刷在线DIY定制商城系统&#xff0c;而且全站采用DIVCSS 布局&#xff0c;可以手机、PC端实时互通。 支持多种产品定制&#xff0c;包括但不限于水杯、雨伞、U盘、T恤、衬衫和四件套。独创的制作间…

Jenkins与Docker的自动化CI/CD流水线实践

Pipeline 有诸多优点&#xff0c;例如&#xff1a; 项目发布可视化&#xff0c;明确阶段&#xff0c;方便处理问题 一个Jenkins File文件管理整个项目生命周期 Jenkins File可以放到项目代码中版本管理 Jenkins管理界面 操作实例&#xff1a;Pipeline的简单使用 这里是比较…

电源控制系统架构(PCSA)之系统分区电压域

目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽&#xff0c;只是可能性的一个子集。目的是描述基于Arm组件的SoC…

MySQL-04-InnoDB存储引擎锁和加锁分析

Latch一般称为闩锁&#xff08;轻量级锁&#xff09;&#xff0c;因为其要求锁定的时间必须非常短。在InnoDB存储引擎中&#xff0c;latch又分为mutex&#xff08;互斥量&#xff09;和rwlock&#xff08;读写锁&#xff09;。 Lock的对象是事务&#xff0c;用来锁定的是…

实验题【网关设置+VRRP+静态路由+OSPF】(H3C模拟器)

嘿&#xff0c;这里是目录&#xff01; ⭐ H3C模拟器资源链接1. 实验示意图2. 要求和考核目标3. 当前配置3.1 PC1、PC2、PC3、PC4和PC5配置3.2 SW配置3.2.1 SW2配置3.2.2 SW3配置3.2.3 SW4配置3.2.4 SW1配置 3.2. R配置3.2.1 R1配置3.2.2 R2配置 ⭐ H3C模拟器资源链接 H3C网络…

Windows下安装MySQL

几年前学习mycat中间件的时候在window机器上安装过MySql&#xff0c;但是由于电脑配置不高&#xff0c;同时打开Mysql服务&#xff0c;idea、SQlyog等软件非常卡&#xff0c;再加上SQLyog和MySQL版本不兼容导致登录不上&#xff0c;于是把它卸载了。最近做练习需要&#xff0c;…

Qt 软件调试(二)使用dump捕获崩溃信息

Qt应用程序异常崩溃该怎么办&#xff0c;生成dump文件再回溯分析&#xff0c;可以快速且准确的帮助我们定位到崩溃的点。那么&#xff0c;本章我们分享下如何在Qt中生成dump文件。 一、使用minudump捕获崩溃信息 #include <QCoreApplication> #include <QDir> #i…

用Python写一个浏览器集群框架

更多Python学习内容&#xff1a;ipengtao.com 在分布式爬虫和大规模数据采集的场景中&#xff0c;使用浏览器集群是一种有效的方式&#xff0c;可以提高数据采集的速度和效率。本文将介绍如何用Python编写一个简单但强大的浏览器集群框架&#xff0c;以应对需要使用多个浏览器实…

原生小程序图表

原生小程序使用图表 话不多说直接进入正题 官方文档: https://www.ucharts.cn/v2/#/ 下载文件 首先去gitee上把文件下载到自己的项目中 https://gitee.com/uCharts/uCharts 找到微信小程序和里面的组件 把里面src下的文件全部下载下来放入自己项目中 项目文件 新建文件…

使用Linux JumpServer堡垒机本地部署与远程访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装Jump server二. 本地访问jump server三. 安装 cpolar内网穿透软件四. 配…

【面试HOT200】滑动窗口篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…

linux shell操作 - 05 IO 模型

文章目录 流IO模型阻塞IO非阻塞IOIO多路复用异步IO网络IO模型 流 可以进行IO&#xff08;input输入、output输出&#xff09;操作的内核对象&#xff1b;如文件、管道、socket…流的入口是fd (file descriptor)&#xff1b; IO模型 阻塞IO&#xff0c; 一直等待&#xff0c;…

LLMLingua:集成LlamaIndex,对提示进行压缩,提供大语言模型的高效推理

大型语言模型(llm)的出现刺激了多个领域的创新。但是在思维链(CoT)提示和情境学习(ICL)等策略的驱动下&#xff0c;提示的复杂性不断增加&#xff0c;这给计算带来了挑战。这些冗长的提示需要大量的资源来进行推理&#xff0c;因此需要高效的解决方案&#xff0c;本文将介绍LLM…

分布式篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、你知道哪些限流算法?二、说说什么是计数器(固定窗口)算法三、说说什么是滑动窗口算法前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去…

golang panic关键词执行原理与代码分析

使用的go版本为 go1.21.2 首先我们写一个简单的panic调度与捕获代码 package mainfunc main() {defer func() {recover()}()panic("panic test") }通过go build -gcflags -S main.go获取到对应的汇编代码 可以看到当我们调度panic时&#xff0c;Go的编译器会将这段…

利用Nginx与php处理方式不同绕过Nginx_host实现SQL注入

目录 首先需要搭建环境 nginxphpmysql环境&#xff1a; 搭建网站 FILTER_VALIDATE_EMAIL 绕过 方法1&#xff1a;冒号号分割host字段 方法2&#xff1a;冒号号分割host字段 方法3&#xff1a;SNI扩展绕过 首先需要搭建环境 nginxphpmysql环境&#xff1a; php安装包&a…