Hive SQL 函数高阶应用场景

HIVE作为数据仓库处理常用工具,如同RDBMS关系型数据库中标准SQL语法一样,Hive SQL也内置了不少系统函数,满足于用户在不同场景下的数据分析需求,以提高开发SQL数据分析的效率。
我们可以使用show functions查看当下版本支持的函数,并且可以通过describe function extended funcname来查看函数对应的使用方式和方法,下面我们将描述HIVE SQL中常用函数的高阶使用场景。

1、行转列(explode)

如下活动列表:tb_activities

活动ID活动名称列表
1双111,国庆,元旦
2黄金周,国庆,元旦

希望转换为列类型活动表:tb_activitity

活动ID活动名称
1双11
1国庆
1元旦
2黄金周
2国庆
2元旦

使用到Hive内置一个非常著名的UDTF函数,名字叫做explode函数,中文戏称为“爆炸函数”,可以炸开数据转换为多行。

insert into table tb_activitity select id,activity from tb_activities 
lateral view explode(split(activities,','))enum_tmp as activity;

2、列转行

如上1所示,希望从tb_activity转换为tb_activities,通过collect_set()方法和group by id 将列转换为行,实现如下:

 select id, concat_ws(',',collect_set(activity)) as activities from tb_activity group by id;

3、排名(rank())

可以通过rank() 方法的使用,实现对指定列进行排名,输出排名结果。例如商品总数表:t_item_sum,需要实现排名功能:

item_iditem_sum
100120
100212
100362
100415

期望得到:

item_iditem_sumrank
1003621
1001202
1004153
1002124

代码实现如下:

select item_id,item_sum,rank()over(order by item_sum desc) as rank from t_item_sum;

4、分组去重

在查询数据时如果有重复,我们可以使用用distinct 去除重复值,但使用 distinct 只能去除所有查询列都相同的记录,如果某个字段不同,distinct 就无法去重。这时我们可以用 row_number()over(partitioon by column1 order by column2) 先进行分组。
例如:有活动表数据列“活动id,用户id,活动名称,客户群组,过期时间”,希望按照”活动id,活动名称,客户群组”去重,取最新一条数据。

iduser_idactivitycust_groupexpired_at
BCP0151001春节活动A高价值2023-10-05
BCP0151001春节活动A高价值2023-10-15
BCP0151001春节活动A高价值2023-10-28
BCP0251002春节活动B中价值2023-10-05
BCP0251002春节活动B中价值2023-10-25
BCP0301003春节活动C中价值2023-10-25

期望得到:

iduser_idactivitycust_groupexpired_at
BCP0151001春节活动A高价值2023-10-28
BCP0251002春节活动B中价值2023-10-25
BCP0301003春节活动C中价值2023-10-25

使用row_number()over(partitioon by) 分组去重。

  select tt1.* from(select id, user_id, activity,cust_group,row_number() over(partition by concat(id,activity,cust_group)order by expired_at desc)as row_num from tb_acitivity_full)tt1 where tt1.row_num=1;

5、指标统计

GROUPING SETS,GROUPING__ID,CUBE,ROLLUP,这几个hive分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻( roll up )和下钻( drill down )的指标统计,比如,分小时、天、月的UV数。上钻是沿着维度的层次向上聚集汇总数据,下钻是在分析时加深维度,对数据进行层层深入的查看。通过逐层下钻,数据更加一目了然,更能充分挖掘数据背后的价值,及时做出更加正确的决策。

OLAP函数使用说明
GROUPING SETS根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL
GROUPING__ID表示结果属于哪一个分组集合,属于虚字段
CUBE可根据GROUP BY的维度的所有组合进行聚合
ROLLUP作为CUBE的子集,以最左侧的维度为主,从该维度进行层级聚合

如4所示,希望对指标值进行统计,期望结果:

indicatorenum_valuecount
idBCP0153
idBCP0252
idBCP0301
activity春节活动A3
activity春节活动B2
activity春节活动C1
cust_group高价值3
cust_group中价值3

通过grouping__id 内层SQL处理结果,表2:

groupIdidactivitycust_groupuv
1728id_BCP015NULLNULL3
1724id_BCP025NULLNULL2
1723id_BCP030NULLNULL1
2728NULLactivity_春节活动ANULL 3
2724NULLactivity_春节活动BNULL 2
2723NULLactivity_春节活动CNULL 1
3723NULLNULLcust_group_高价值3
3724NULLNULLcust_group_中价值3
select split(coalesce(id,activity,cust_group),'\\_')[0] as indicator,coalesce(split(id, '\\_')[1],split(activity, '\\_')[1],split(cust_group, '\\_')[1],) as enum_valuesum(uv) as countfrom (-- 内层SQL处理结果,对应上表2select grouping__id as groupId,concat('id|',id) as id,concat('activity|', activity) as activity,concat('cust_group|',cust_group) as cust_group,count(*) as uvfrom tb_acitivity_fullgroup by concat('id|',id),concat('activity|', activity),concat('cust_group|',cust_group)grouping sets(concat('id|',id),concat('activity|', activity),concat('cust_group|',cust_group))as tt1group by split(coalesce(id,activity,cust_group),'\\_')[0],coalesce(split(id, '\\_')[1],split(activity, '\\_')[1],split(cust_group, '\\_')[1],);

6、JSON数据处理

JSON数据作为数据存储和数据处理中最常见的结构化数据格式之一,许多场景下都会将数据以JSON格式存储在文件系统(HDFS/MINIO等)中,当构建数据仓库时,对JSON格式的数据进行处理和分析,就需要在Hive中使用对应函数对JSON格式的数据进行解析读取。
例如,JSON格式的数据如下:

商品ID商品名称额外信息
1001IP15“fixedIntegral”:200, “source”:“wechat”,“stages”:12}

获取商品可使用的固定积分:

select get_json_object(extra_json, '$fixedIntegral) as integral
from t_items;

7、替换

7.1 translate 函数用法
select translate('abcdef', 'adc', '19') tb_translate_exe
输出:
1b9ef
  • translate(input,from,to)
  • input:输入字符串
  • from:需要匹配的字符
  • to :用哪些字符来替换被匹配到的字符
    注意点:这里from的字符与to字符在位置上存在一 一对应关系,也就是from中每个位置上的字符用to中对应位置的字符替换。
7.1 regexp_replace 函数

正则替换

SELECT  aa,REGEXP_REPLACE(aa, '[a-z]', '')    -- 替换所有字母,REGEXP_REPLACE(aa, '[abc]', '')    -- 替换指定字母,REGEXP_REPLACE(aa, '[^abc]', '')    -- 替换所有非字母,REGEXP_REPLACE(aa, '[0-9]', '')    -- 替换所有数字,REGEXP_REPLACE(aa, '[\\s\\S]', '')    -- 替换空白符、换行,\\s:是匹配所有空白符,包括换行,\\S:非空白符,不包括换行。,REGEXP_REPLACE(aa, '\\w', '')    -- 替换所有字母、数字、下划线。等价于 [A-Za-z0-9_],REGEXP_REPLACE(aa, '[-8+]', '')    -- 只替换-8这个字符,REGEXP_REPLACE(aa, '[-8*]', '')    -- 替换-8、-、8这几个字符
FROM    (SELECT  '5e40b2b8-0916-42c0-899a-eaf4b2df 5268' AS aaUNION ALLSELECT  'c81b5906-38d7-482c-8b66-be5d3359cbf6' AS aaUNION ALLSELECT  '8856fd0a-2337-4605-963f-0d0d059b1937' AS aa) t
;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ShareMouse for Mac(多台电脑鼠标键盘共享软件)

ShareMouse mac版是一款Mac平台上可以在多台电脑间共享鼠标的工具软件,sharemousefor Mac支持 Windows 与 Mac,并可以在不同电脑间共享剪贴板。只需要移动鼠标指针的到想控制的显示器那里去、鼠标光标就会神奇地“跨越”到邻近的电脑屏幕上。每个计算机都…

linux安装新版本git2、配置github-ssh。(centos、aws)

一、安装Git 1、yum默认版本git #1.安装git sudo yum install git -y #2.确认Git已经安装成功 git --version如果要安装较新版本,可以安装一个repo ,但是我这第一次尝试失败了,执行完提示找不到git2u,ius repo也连不上。而且每次…

FreeRTOS学习day1

顾名思义 免费的实时操作系统 用法基本和Linux下的多线程编程类似 探索者开发版实验 动态创建4个任务start_task task1 task2 task3 优先级依次为1 2 3 4 (注意优先级不能为0,0是空闲任务) 我的理解:主线程start_task 主线程 task1 ta…

LeetCode 2894. 分类求和并作差【数学,容斥原理】1140

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

doc与docx文档转html,格式样式不变(包含图片转换)

最近做一个富文本的需求,要求把文档内容转换到富文本内,文档中的格式也好,样式也好,图片啥的都要一致展示;踩了不少坑,据说word文档其实是一个压缩包,我不是特别清楚但是也能理解,自…

一、BurpSuite基本界面学习

一、Dashboard 1.Scan Scan功能:能够对网站进行爬行(主要发现网站可交互的接口和网址关联的路径,结果显示在Target)和代码审计(除了爬行的效果外,一定程度上会进行漏洞发现与查找) 重点&#…

Java代理

一、代理模式 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问。 上面类图中有一个订单接口类(OrderService)、一个订单实现类(OrderServiceImpl),订单模块的业务相对复杂和重要,如果这时候要在方法执行前后加上日志&#xff0c…

SD NAND对比TF卡优势(以CSNP4GCR01-AMW为例)

最近做的一个项目, 需要加大容量存储,这让我想到之前在做ARM的开发板使用的TF卡方案,但是TF卡需要携带卡槽的,但是有限的PCB板布局已经放不下卡槽的位置。 这个时候就需要那种能够不用卡槽,直接贴在板子上面&#xff0…

深度学习_3_实战_房价预测

梯度 实战 代码: # %matplotlib inline import random import torch import matplotlib.pyplot as plt # from d21 import torch as d21def synthetic_data(w, b, num_examples):"""生成 Y XW b 噪声。"""X torch.normal(0,…

【Ubuntu18.04】Livox Tele-15使用教程

Livox Tele-15使用教程 引言1 下载并安装Livox Viewer1.1 打开Livox Viewer程序1.2 设备ip链接 2 览沃Livox SDK二次开发并封装ROS2.1 览沃Livox SDK安装2.2 览沃Livox livox_ros_driver 安装2.3 Launch 配置文件描述 3 保存lvx格式的数据文件3.1 使用览沃Viewer保存lvx文件3.2…

vuecli2关于下载本地取环境变量没问题部署后路径取不到环境变量问题解决

功能 下载功能,用a标签实现下载 代码错误思路分析 解决办法可以忽略直接看下面 解决思路 在每个config文件中都定义了file_url,本地运行没有问题,但是部署到服务器开发环境, 拿到的是生产环境的FILE_URL地址 首先看了流水线-构建配置-编译配置-编译脚本里的打包命令: ** 本…

51单片机KeyWard

eg1: 单片机键盘的分类 键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值得称为编码键盘,如计算机键盘,而靠软件来识别的称为非编码键盘,在单片机组成的各种…

百度松果20231022作业

越狱 盒子与球 斯特林第二类数(用dp求)*盒子的阶乘 int dp[11][11]; //n>k int A(int x){int res1;fer(i,2,x1)res*i;return res; } signed main(){IOS;dp[2][1]dp[2][2]dp[1][1]1;fer(i,3,11){dp[i][1]1;fer(j,2,i){dp[i][j]j*dp[i-1][j]dp[i-1][j-…

小程序如何搭建在服务器上

小程序可以通过搭建在服务器上,来实现跨平台的访问和使用。以下是搭建小程序在服务器上的步骤: 安装Node.js:首先,你需要在服务器上安装Node.js。你可以从Node.js的官方网站下载并安装。 安装微信开发者工具:然后&…

简单的代码优化(后端)

上一篇谈了谈简单的前端的优化,这次就以下几点谈谈后端的优化。 书写时常见的。 循环里面不要走IO流。 走IO,是要对硬盘进读写操作的。就结论而言,硬盘的读写速度是低于内存的,比如说硬盘上读一次数据,需要1秒&#…

面试知识储备--打包工具篇(webpack和vite)

1.vite常用配置 常用配置 1.preprocessorOptions 传递给 CSS 预处理器的配置选项 2.PostCSS 也是用来处理 CSS 的,只不过它更像是一个工具箱,可以添加各种插件来处理 CSS 3.resolve.extensions 导入时想要省略的扩展名列表。默认值为 [‘.mjs’, ‘.js’…

Linux shell编程学习笔记13:文件测试运算

*更新记录:20231020 为补充了(十五)检测文件是否存在并且是一个符号链接 补充了一个例子 Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、逻辑、字符串、文件测试等多种运算。前面几节我们依次研究了 Linux she…

泰森多边形

泰森多边形 93 泰森多边形又叫沃洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是一组由连接两邻点线段的垂直平分线组成的连续多边形。一个泰森多边形内的任一点到构成该多边形的控制点的距离小于到其他多边形控制点的距离。…

2.3.C++项目:网络版五子棋对战之实用工具类模块的设计

文章目录 一、实用工具类模块(一)功能 二、设计和封装(一)日志宏封装(二)mysql_util封装(三)Jsoncpp-API封装(四)file_util封装(五)st…

C. You Are So Beautiful Codeforces Round 905 (Div. 2)

Problem - C - Codeforces 题目大意&#xff1a;有一个长度为n的数组a&#xff0c;问有多少个子串[l,r]&#xff0c;满足这个子串作为子序列只在a中出现过一次 1<n<1e5;1<a[i]<1e9 思路&#xff1a;我们发现对于从1开始的连续区间&#xff0c;答案都是非递减的&…