大数据Hive篇:explode 和 posexplode

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

一. explode单独使用。

1.1. 用于array类型的数据
  • table_name 表名
  • array_col 为数组类型的字段
  • new_col array_col被explode之后对应的列
select explode(array_col) as new_col from table_name
1.2. 用于map类型的数据

由于map是kay-value结构的,所以它在转换的时候会转换成两列,一列是kay转换而成的,一列是value转换而成的。

  • table_name 表名
  • map_col 为map类型的字段
  • may_key_col, may_value_col 分别对应map_col被拆分之后的map映射里的key 和 value
select explode(map_col) as (may_key_col, may_value_col) from table_name

二.explode结合lateral view使用

2.1 创建测试表,插入数据

CREATE table student_score(
	stu_id string comment '学号',
	stu_name string comment '姓名',
	courses string comment '各个科目',
	scores string comment '各个分数'
) comment '学生成绩表';

insert into student_score values 
("1001", "张三","语文,数学,英语,历史,地理", "88,87,94,86,84"),
("1002", "李四", "语文,数学,英语,历史,地理", "78,89,75,79,68"),
("1003", "王五", "语文,数学,英语,历史,地理", "98,97,91,93,92"),
("1004", "朱六", "语文,数学,英语,历史,地理", "66,63,64,67,68");

2.2 测试explode 行转列

select a.stu_id, a.stu_name, table_view.course 
from student_score a 
lateral view explode(split(courses, ',')) table_view as `course`;

大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop
查询每个学生课程对应的分数,使用posexplode函数
先测试使用explode, 看看效果:

select a.stu_id, a.stu_name, 
    table_view1.course, table_view2.score
from student_score a 
lateral view explode(split(courses, ',')) table_view1 as `course` 
lateral view explode(split(scores, ',')) table_view2 as `score`;

大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop
出现这种情况是因为两个并列的explode的sql没办法识别每个科目对应的成绩是多少,对于多个数组的行转列可以使用posexplode函数。
例如使用如下查询语句:

select stu_id, stu_name, course, score 
from student_score 
lateral view posexplode(split(courses, ',')) table_view1 as a, course 
lateral view posexplode(split(scores, ',')) table_view2 as b, score 
where a = b;

大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop

三. 进阶使用

1、空格字符串函数:space

语法: space(int n)
返回值: string
说明:返回长度为n的空格字符串
举例:

hive> select space(10) from dual;
hive> select length(space(10)) from dual;
10
2、space函数与split函数结合,得到数组;

space函数与split函数结合,可以得到空格字符串数组
举例:

hive>select split(space(10), '');
[" "," "," "," "," "," "," "," "," "," ",""]
3、如何产生1-100的连续的数字?

结合space函数与split函数,posexplode函数,lateral view函数获得
实现方法一:

select
id_start+pos as id
from(
    select
    1 as id_start,
    100 as id_end
) m  lateral view posexplode(split(space(id_end-id_start), '')) t as pos, val

实现方法二:

select
  row_number() over() as id
from  
  (select split(space(99), ' ') as x) t
lateral view
explode(x) ex;

备注:explode(x)和posexplode()均为炸裂函数,区别在于explode炸出一个值,posexplode不仅炸出一个值还附带索引号;

3. 如何产生开始日期到结束日期的连续的日期?
 SELECT 
	DATE_ADD(START_DATE, pos)
FROM (
	SELECT DISTINCT
		"2023-03-13" AS START_DATE,
		"2023-03-23" AS END_DATE
  	from order_detail
) s1 lateral VIEW posexplode(split(SPACE(DATEDIFF(END_DATE, START_DATE)), " ")) s2 AS pos, null_ele

大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop

四. explode和posexplode对比

数据表:
表名:default.class_info,分别是班级,姓名,成绩 3列

大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop
单列Explode:
需求:将student这一列中数据由一行变为多行(使用split和explode,并结合lateral view函数实现)

select
    class,student_name
from
    default.class_info
    lateral view explode(split(student,',')) t as student_name

大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop
单列Posexplode

需求:想要给每班的每个同学按照顺序来一个编号(使用posexplode函数)

select
    class,student_index + 1 as student_index,student_name
from
    default.class_info
    lateral view posexplode(split(student,',')) t as student_index,student_name;

注意:student_index+1 是因为index是从0开始的大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop

多列Explode
需求:基于学生姓名和分数使其两两匹配,期望得到如下效果。
大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop
尝试: 先对两列进行explode

select
    class,student_name,student_score
from
    default.class_info
    lateral view explode(split(student,',')) sn as student_name
    lateral view explode(split(score,',')) sc as student_score

结果如下:大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop
不太符合预期,如果对两列都进行explode的话,假设每列都有3个值,最终会变为3*3=9行,但我们实际只想要3行

解决办法:

我们进行两次posexplode,姓名和成绩都保留对应的序号,即便是变成了9行,通过where筛选只保留行号相同的index即可。

select
    class,student_name,student_score
from
    default.class_info
    lateral view posexplode(split(student,',')) sn as student_index_sn,student_name
    lateral view posexplode(split(score,',')) sc as student_index_sc,student_score
where
    student_index_sn = student_index_sc;

大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop
需求:假设我们又想对同学的成绩进行一下排名(借助rank( ) 函数 )

select
    class,
    student_name,
    student_score,
    rank() over(partition by class order by student_score desc) as student_rank
from
    default.class_info
    lateral view posexplode(split(student,',')) sn as student_index_sn,student_name
    lateral view posexplode(split(score,',')) sc as student_index_sc,student_score
where
    student_index_sn = student_index_sc
    order by class,student_rank;

大数据Hive篇:explode 和 posexplode,大数据,hive,hadoop
补充:

若没有spilt函数,可能会用到array()

lateral view
      posexplode (array()) as as f_keys,f_values

user_id bus_ bike_ taxi_ train_
1001 503 89 708 2054
1002 24 17 1008 500
1003 80 50 500 400

user_id pay_type Amount
1001 1 503
1001 2 89
1001 3 708
1001 4 2054文章来源地址https://www.toymoban.com/news/detail-548698.html

select
	user_id,
	index_+1 as pay_type,
	value as amount
from pay_record_log  
lateral view
posexplode(ARRAY(bus_,bike_,taxi_,train_))t as index_,value 

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

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

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

相关文章

  • MySQL实现数据炸裂拆分(类似Hive的explode函数的拆分数组功能)

    背景描述 ​ 在Hive中,\\\"explode\\\"函数用于将数组类型的列拆分为多行,以便对数组中的每个元素进行处理。然而,在MySQL中,并没有直接的类似功能。但是,我们可以使用一些技巧来模拟这个功能,实现在MySQL中拆分数组并进行查询的操作。本文将介绍如何在MySQL中实现类似Hiv

    2024年02月11日
    浏览(42)
  • Hive Lateral View + explode 详解

    hive中的函数分为3类,UDF函数、UDAF函数、UDTF函数 UDF:一进一出 UDAF:聚集函数,多进一出,类似于:count/max/min UDTF:一进多出,如explore()、posexplode(),UDTF函数的时候只允许一个字段 百度explode()时,经常会出现lateral view + explode相关的文章,很少单独写explode()。 分别 了解 ecplode() 与

    2023年04月11日
    浏览(38)
  • HiveSQL题——炸裂函数(explode/posexplode)

    目录 一、炸裂函数的知识点 1.1 炸裂函数  explode  posexplode 1.2 lateral view 侧写视图 二、实际案例 2.1 每个学生及其成绩 0 问题描述 1 数据准备 2 数据分析 3 小结 2.2 日期交叉问题 0 问题描述 1 数据准备 2 数据分析 3 小结 2.3 用户消费金额 0 问题描述 1 数据准备 2 数据分析 3 小

    2024年03月15日
    浏览(44)
  • Hive 中的爆炸函数( lateral view 与 explode 用法)

    explode就是将hive一行中复杂的array或者map结构拆分成多行。 lateral view用于和split, explode等函数一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合

    2024年02月12日
    浏览(46)
  • HIVE SQL通过Lateral View + explode实现列转行

    原表: a b Andy 碟中谍,谍影重重,007 MOMO 小鞋子,朋友啊你的家在哪里 David ‘’ Lily NULL 实现效果 a b Andy 碟中谍 Andy 谍影重重 Andy 007 MOMO 小鞋子 MOMO 朋友啊你的家在哪里 David ‘’ 实现代码: 注: explode函数:处理map结构的字段,将数组转换成多行,所以此处使用了split函数将

    2024年02月12日
    浏览(37)
  • explode与lateral view使用详解(spark及hive环境对比)

    定义: explode函数能够将array及map类型的数据炸开,实现一行变多行 格式: select explode(array/map) from table 示例 原始数据tmp表 name id goods a 1 book_a,food_a b 2 book_b,food_b c 3 null  输出结果 goods_col book_a food_a book_b food_b 定义: Lateral 也是用来对数组进行列转行的,Lateral View主要解决在

    2024年02月03日
    浏览(33)
  • 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日
    浏览(55)
  • 大数据之Hadoop数据仓库Hive

    Hive 是一个构建在 Hadoop 之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类 SQL 查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 Hadoop 上运行。 特点: 简单、容易上手 (提供了类似 sql 的查询语言 hql),使得精通 sql 但是不了解 Java 编程的人也

    2024年02月01日
    浏览(54)
  • HDFS 跨集群数据同步(hive,hadoop)

    两个不同的HDFS 集群数据迁移( A集群的数据 - B 集群) 采用的是 SHELL 脚本  按表进行; 日期分区进行; #!/bin/bash ##################### #创建人:DZH #创建日期: 2020-04 #内容: 数据迁移 ##################### ##################################### [ \\\"$#\\\" -ne 0 ] FILE=$1 path=$(cd `dirname $0`; pwd) ############## 获取执

    2024年04月27日
    浏览(58)
  • 大数据技术之Hadoop学习(七)——Hive数据仓库

    目录 素材 一、数据仓库简介 1、数据仓库的认识 (1)数据仓库是面向主题的。 (2)数据仓库是随时间变化的。 (3)数据仓库相对稳定 (4)OLTP和OLAP 2、数据仓库的结构 (1)数据源 (2)数据存储及管理 (3)OLAP 服务器 (4)前端工具 3、数据仓库的数据模型 (1)星状模

    2024年02月17日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包