Hive SQL 函数高阶应用场景

这篇具有很好参考价值的文章主要介绍了Hive SQL 函数高阶应用场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1、行转列(explode)

如下活动列表:tb_activities

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

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

活动ID 活动名称
1001 双11
1001 国庆
1001 元旦
2001 黄金周
2001 国庆
2001 元旦

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

select act_id,activity from tb_activities 
lateral view explode(split(activities,','))enum_tmp as activity;

扩展: 如果要按照活动Id增加索引,可以使用posexplode:

编号 活动ID 活动名称
1 1001 双11
2 1001 国庆
3 1001 元旦
1 2001 黄金周
2 2001 国庆
3 2001 元旦
select pos+1,act_id,activity from tb_activities 
lateral view explode(split(activities,','))enum_tmp as pos,activity

2、列转行

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

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

3、排名(rank())

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

item_id item_sum
1001 20
1002 12
1003 62
1004 15

期望得到:

item_id item_sum rank
1003 62 1
1001 20 2
1004 15 3
1002 12 4

代码实现如下:

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,活动名称,客户群组”去重,取最新一条数据。

id user_id activity cust_group expired_at
BCP015 1001 春节活动A 高价值 2023-10-05
BCP015 1001 春节活动A 高价值 2023-10-15
BCP015 1001 春节活动A 高价值 2023-10-28
BCP025 1002 春节活动B 中价值 2023-10-05
BCP025 1002 春节活动B 中价值 2023-10-25
BCP030 1003 春节活动C 中价值 2023-10-25

期望得到:

id user_id activity cust_group expired_at
BCP015 1001 春节活动A 高价值 2023-10-28
BCP025 1002 春节活动B 中价值 2023-10-25
BCP030 1003 春节活动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所示,希望对指标值进行统计,期望结果:

indicator enum_value count
id BCP015 3
id BCP025 2
id BCP030 1
activity 春节活动A 3
activity 春节活动B 2
activity 春节活动C 1
cust_group 高价值 3
cust_group 中价值 3

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

groupId id activity cust_group uv
1728 id_BCP015 NULL NULL 3
1724 id_BCP025 NULL NULL 2
1723 id_BCP030 NULL NULL 1
2728 NULL activity_春节活动A NULL 3
2724 NULL activity_春节活动B NULL 2
2723 NULL activity_春节活动C NULL 1
3723 NULL NULL cust_group_高价值 3
3724 NULL NULL cust_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_value
  sum(uv) as count
  from (
  -- 内层SQL处理结果,对应上表2
   select grouping__id as groupId,
    concat('id|',id) as id,
    concat('activity|', activity) as activity,
    concat('cust_group|',cust_group) as cust_group,
    count(*) as uv
   from tb_acitivity_full
   group 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 tt1
  group 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 商品名称 额外信息
1001 IP15 “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 函数

正则替换文章来源地址https://www.toymoban.com/news/detail-741306.html

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 aa
            UNION ALL
            SELECT  'c81b5906-38d7-482c-8b66-be5d3359cbf6' AS aa
            UNION ALL
            SELECT  '8856fd0a-2337-4605-963f-0d0d059b1937' AS aa
        ) t
;

到了这里,关于Hive SQL 函数高阶应用场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL使用技巧(6)HIVE开窗函数

    开窗函数的使用铁律:不要滥用 先想明白自己要实现什么样的功能,然后再去实践。没有目的的尝试段不可取,会难以理解各开窗函数的真正用法。 如果没有现成可用HIVE库,可以参见本人 大数据单机学习环境搭建 系列文章。 1.1Hive建表 1.2数据准备 1.3保存为HDFS文件 1.4验证

    2024年02月08日
    浏览(47)
  • Hive 中执行 SQL语句 报错 :FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.

    在命令输入 hive 启动后: 解决方案: **错误原因:**服务端未开启服务,在hive服务端使用命令:hive --service metastore 然后再启动hive , 就可以正常使用sql语句了。 **其他原因:**有的是mysql没有启动,下面有完整的hive 启动流程 启动hive 流程(很多问题往往是少了步骤导致的)

    2024年02月15日
    浏览(43)
  • hive sql—开窗函数—累积求和和滑动求和

    数据集有三列数据,姓名、月份和数量: 图1 使用 sum() 函数和 over() 来实现,如下: 结果如下: 同一个name,后一个月份都是前几个月份的累加和 图2 需要稍微骚一点的操作,加上一个限制条件: 数字:可正可零可负,正往前,负向后;preceding:向前几行;following:向后几行

    2024年02月11日
    浏览(34)
  • SQL使用技巧(4.1)Hive日期时间函数

    常用的格式化(format)标识符: 本章节每一行代码后都有运算说明和执行结果样例,例如 - - 返回当前系统日期 yyyy-MM-dd, 【2023-04-01】 原生hive中不支持 now() 的写法,经过加工的工具(TDWTDH)可能支持,不绝对。 unix_timestamp() 也会返回一个时间戳,但并不是系统当前时间的时间

    2024年02月12日
    浏览(35)
  • Hive SQL——explode拆分函数&多行(列)合并为一行(列)&reflect函数

    cd /data/import/ sudo vi test_explode_map_array.txt 添加以下文件内容 小明    产品1,产品2,产品3    性别:男,年龄:24 小花    产品4,产品5,产品6    性别:女,年龄:22  map_key map_value 年龄 24 性别 男 年龄 22 性别 女 prod_arr_new 产品1 产品2 产品3 产品4 产品5 产品6 name prod_arr_new 小明 产品1

    2024年02月15日
    浏览(42)
  • Hive SQL 中ARRAY或MAP类型数据处理:lateral view explode()/posexplode()——行转列函数

    前言:在对表数据进行批量处理过程中,常常碰上某个字段是一个array或者map形式的字段,一列数据的该字段信息同时存在多个值,当我们需要取出该数组中的每一个值实现一一对应关系的时候,可以考虑使用lateral view explode()/posexplode() 进行处理。 一、提要:explode()本身是

    2024年02月04日
    浏览(37)
  • 44、Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示例--网上有些说法好像是错误的

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月09日
    浏览(30)
  • [hive] 在hive sql中定义变量

    在Hive SQL中,可以使用 SET 命令来定义变量。 变量可以用于存储和引用常量或表达式的值,以便在查询中重复使用。 下面是定义和使用变量的示例: 使用 SET 命令定义了一个名为 my_var 的变量, 在查询中使用 ${my_var} 引用变量。这样,变量的值将被替换为实际的字符串,从而

    2024年02月03日
    浏览(27)
  • hive sql 和 spark sql的区别

    Hive SQL 和 Spark SQL 都是用于在大数据环境中处理结构化数据的工具,但它们有一些关键的区别: 底层计算引擎: Hive SQL:Hive 是建立在 Hadoop 生态系统之上的,使用 MapReduce 作为底层计算引擎。因此,它的执行速度可能相对较慢,尤其是对于复杂的查询。 Spark SQL:Spark SQL 则建

    2024年01月20日
    浏览(32)
  • hive SQL谓词下推

    Sql 优化:谓词下推(PPD 定义 谓词下推的概念其实出现在sql中,在关联查询时(join,left join ,right join),因为涉及两个大表之间的关联(特别是在hive)造成资源消耗会比较大, 因为建议在join之前先将两个表进行过滤(hive 里指的是在map端进行过滤),系统会进行部分优化,但sql需要遵

    2024年04月27日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包