Hive SQL——explode拆分函数&多行(列)合并为一行(列)&reflect函数

这篇具有很好参考价值的文章主要介绍了Hive SQL——explode拆分函数&多行(列)合并为一行(列)&reflect函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、拆分 map 和 array

1.执行Linux命令

cd /data/import/
sudo vi test_explode_map_array.txt

  • 添加以下文件内容

小明    产品1,产品2,产品3    性别:男,年龄:24
小花    产品4,产品5,产品6    性别:女,年龄:22 

2.创建表并加载数据

-- 开启智能本地模式
-- set hive.exec.mode.local.auto=true;

-- 创建表
create table test.test_explode_map_array(
    name string, 
    prod_arr array<string>,
    info_map map<string, string>)
row format delimited
-- 字段分隔符为'\t'
fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
stored as textfile;

-- 加载数据(方法一)
load data local inpath '/data/import/test_explode_map_array.txt'
into table test.test_explode_map_array;

-- 加载数据(方法二)
insert into test.test_explode_map_array 
select '小明', array('产品1', '产品2', '产品3'), str_to_map('性别:男,年龄:24');
insert into test.test_explode_map_array 
select '小花', array('产品4', '产品5', '产品6'), str_to_map('性别:女,年龄:22');

3.查询结果1

map_key map_value
年龄 24
性别
年龄 22
性别
select
	-- explode拆分后必须加括号
	explode(info_map) as (map_key, map_value)
from test.test_explode_map_array;



-- 查询其他字段, lateral view(侧视图, 虚拟表)
select 
	name, map_key, map_value
from test.test_explode_map_array
-- 必须去掉括号map_key, map_value
lateral view explode(info_map) tmp_table as map_key, map_value;

4.查询结果2

prod_arr_new
产品1
产品2
产品3
产品4
产品5
产品6
select 
	-- explode拆分数组
	explode(prod_arr) as prod_arr_new
from test.test_explode_map_array;

5.查询结果3

name prod_arr_new
小明 产品1
小明 产品2
小明 产品3
小花 产品4
小花 产品5
小花 产品6

-- 查询其他字段,lateral view(侧视图, 虚拟表)
select
	name, prod_arr_new
from test.test_explode_map_array
lateral view explode(prod_arr) tmp_table as prod_arr_new;

6.Hive三类UDF

  • UDF:用户自定义函数(user-defined function),输入一个值,返回一个值,一进一出

  • UDAF:用户自定义聚合函数(user-defined aggregate function),输入多个值,返回一个值,多进一出

  • UDTF:用户自定义表生成函数(user-defined table-generating function),输入一个值,返回多个值,一进多出

-- UDF:length\year\month\day ...
-- UDAF:sum\count\max ...
-- UDTF:explode

二、拆分 json

1.执行Linux命令

cd /data/import/

sudo vi test_explode_json.txt

  • 添加以下文件内容

a:shandong,b:beijing,c:hebei|1,2,3,4,5,6,7,8,9|[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]

2.创建表并加载数据

-- 开启智能本地模式
-- set hive.exec.mode.local.auto=true;

-- 创建表
create table test.test_explode_json(
    area string,
    goods_id string,
    sale_info string)
row format delimited
-- 字段分隔符为'|'
fields terminated by '|'
stored as textfile;

-- 加载数据(方法一)
load data local inpath '/data/import/test_explode_json.txt'
overwrite into table test.test_explode_json;

-- 加载数据(方法二)
insert into test.test_explode_json
values('a:shandong,b:beijing,c:hebei', 
       '1,2,3,4,5,6,7,8,9', 
       '[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]')

3.查询结果1

goods_id
1
2
3
4
5
6
7
8
9

select
	explode(split(goods_id,',')) as goods_id
from test.test_explode_json;

 4.查询结果2

code area
a shandong
b beijing
c hebei

select
	regexp_extract(area_new, '(.*):(.*)',1) as code
	, regexp_extract(area_new, '(.*):(.*)',2) as arec
from test.test_explode_json
lateral view explode(split(area,',')) tmp_table as area_new

 5.侧视图详解

lateral view + explode + split

结果集的行数是如何生成的?

  • 查询1个字段

-- 9个元素= 9行
select
	goods_id_new
from test.test_explode_json
lateral view explode(split(goods_id,',')) tmp_table as goods_id_new;
  • 查询2个字段

-- 9个元素*1个元素 = 9行
select
	goods_id_new,area
from test.test_explode_json
lateral view explode(split(goods_id,',')) tmp_table as goods_id_new;
  • 查询3个字段

-- 9个元素*3个元素*1个元素=27行
select
	goods_id_new,area_new,sale_info 
from test.test_explode_json
lateral view explode(split(goods_id,',')) tmp_table as goods_id_new
lateral view explode(split(area,',')) tmp_table as area_new;

6.查询结果3

source monthsales usercount score
7fresh 4900 1900 9.9
jd 2090 78981 9.8
jdmart 6987 1600 9.0
  • 第一步:将字段sale_info的"[{"和"}]"替换为空字符串

"[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]"

select
	regexp_replace(sale_info, '\\[\\{|\\}\\]','')
from test.test_explode_json
  • 第二步:以"},{"拆分为数组

select
	explode(split(regexp_replace(sale_info, '\\[\\{|\\}\\]',''), '\\},\\{'))
from test.test_explode_json
  • 第三步:将数组拆分为多行

select
	sale_info_new
from test.test_explode_json
lateral view explode(split(regexp_replace(sale_info, '\\[\\{|\\}\\]',''), '\\},\\{')) tmp_table as sale_info_new
  • 第四步:转换为json字符串

select
	concat('{', sale_info_new, '}')
from test.test_explode_json
lateral view explode(split(regexp_replace(sale_info, '\\[\\{|\\}\\]',''), '\\},\\{')) tmp_table as sale_info_new
  • 第五步:将json字符串转换为二维表

select
	get_json_object(concat('{', sale_info_new, '}'), '$.source') as source
	, get_json_object(concat('{', sale_info_new, '}'), '$.monthSales') as monthSales
	, get_json_object(concat('{', sale_info_new, '}'), '$.userCount') as userCount
	, get_json_object(concat('{', sale_info_new, '}'), '$.score') as score
from test.test_explode_json
lateral view explode(split(regexp_replace(sale_info, '\\[\\{|\\}\\]',''), '\\},\\{')) tmp_table as sale_info_new

三、多行(列)合并为一行(列)

region_category subclass
东北-办公 系固件,纸张,收纳具,信封,器具,美术,用品,装订机,标签
东北-家具 用具,椅子,桌子,书架
东北-技术 电话,配件,复印机,设备
-- concat(str1|col1, str2|col2, …)
-- 字符串合并,支持任意个字符串;

-- concat_ws(sep, str1, str2, ...)
-- 以sep为分隔符合并str1, str2, ...;如分隔符为null,则返回null;跳过合并值为null或空字符串的参数;

-- collect_set(col)去重汇总
-- 只支持基本数据类型(不支持复合数据类型),将某字段的项去重汇总,返回array数据类型;
-- collect_list(col)不去重汇总



select 
	CONCAT(region, '-',category) as region_category
	, concat_ws(',', collect_set(subclass)) as `产品子类` 
from sm.sm_order_total
group by CONCAT(region, '-',category)

 四、一行(列)拆分为多行(列)

-- 通过以上查询语句来创建表
create table test.test_explode_split as 
select 
	CONCAT(region, '-',category) as region_category
	, concat_ws(',', collect_set(subclass)) as `产品子类` 
from sm.sm_order_total
group by CONCAT(region, '-',category)
region category subclass_new
东北 办公 系固件
东北 办公 纸张
东北 办公 收纳具
东北 办公 信封
东北 办公 器具
东北 办公 美术
东北 办公 用品
东北 办公 装订机
东北 办公 标签
select 
	regexp_extract(t.region_category, '(.*)-(.*)', 1) as region
	, regexp_extract(t.region_category, '(.*)-(.*)', 2) as category
	, subclass_new 
from test.test_explode_split t
lateral view explode(split(t.subclass, ',')) tmp_table as subclass_new;

五、reflect函数

  • 支持调用java函数

1.执行Linux命令

cd /data/import/
sudo vi test_reflect.txt

  • 添加以下文件内容

11    配饰    7    7
12    配饰    9    5
13    配饰    5    7
14    服饰    9    5
15    服饰    9    4
16    配饰    7    5
17    服饰    8    3
18    配饰    6    5
19    服饰    5    4
20    配饰    9    4

2.调用java的max函数求两列最大值

use test;
-- 创建表
create table test.test_reflect(
    order_id int comment '订单编号',
    product string comment '产品',
    quality int comment '质量',
    service int comment '服务')
row format delimited
fields terminated by '\t';
-- 加载数据
load data local inpath '/data/import/test_reflect.txt'
into table test.test_reflect;



select 
	*
	, reflect('java.lang.Math','max',quality, service) as max_score
from test.test_reflect

3.不同的行执行不同的java函数

  • 配饰:求最大值

  • 服饰:求最小值文章来源地址https://www.toymoban.com/news/detail-613825.html


select
	t.order_id
	, t.product
	, t.quality 
	, t.service 
	, reflect('java.lang.Math', method_name, t.quality, t.service) as score
from
(
	select
		order_id 
		, product
		, quality
		, service 
		, case product when '配饰' then 'max'
			when '服饰' then 'min' end as method_name
	from test.test_reflect
) as t

到了这里,关于Hive SQL——explode拆分函数&多行(列)合并为一行(列)&reflect函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • mysql根据逗号将一行数据拆分成多行数据,顺便展示其他列

    2.处理结果  SQL展示 这个join最基本原理是笛卡尔积。通过这个方式来实现循环。 分析: length(a.path) - length(replace(a.path,‘,’,‘’))+1 表示了,按照逗号分割后,分割需要循环的次数。 join过程: 根据ID进行循环 { 判断:i 是否 = n 获取最靠近第 i 个逗号之前的数据, 即 substr

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

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

    2024年02月04日
    浏览(48)
  • element-ui 表格一行显示多行内容并实现多行内某一行列合并

    这是加上边框的, 去掉边框后这个表格看着更明显一点,表格一行放多行内容,并让第二行进行列合并,第一行不合并 该方法其实就是普通的列合并,只不过使用了row和col使效果看着像是第一行没合并,第二行才合并

    2024年02月11日
    浏览(57)
  • Oracle多行数据合并为一行数据,并将列数据转为字段名

    FZ PROJECT VALUE 1 电脑 $1600 1 手机 $12 1 导管 $1 2 电脑 $2 2 手机 $22 FZ 电脑 手机 导管 1 $1600 $12 $1 2 $2 $22 根据FZ字段筛选并分组,MAX支持字符内容,SUN()同样支持,但是只能是数字类型。 此方法没有数据库类型限制,MySQL、Oracle、达梦均可。 FZ PROJECT 1 电脑,手机,导管 此方法仅仅是合

    2024年02月14日
    浏览(51)
  • MySQL将以逗号分隔的数据分成多行,再合并为一行

    最近遇到个这样的问题,MySQL中的【影片表】中 [演员列] 的内容是用逗号分隔的多个id存储的(例:4356,9691,11337),然后需要把他换成id对应的演员名字(例:屈菁菁,王太利,肖央) 看起来很复杂,其实只要把问题拆分一下就会非常简单 分为三步 第一步:把逗号分隔的多个

    2024年02月11日
    浏览(41)
  • SQL实现一行数据分组后转多行多列

    在统计一些指标时,通常会有多个指标需要分组进行聚合,但是 数据源的粒度可能并非是指标分组的粒度 。举个例子,比如从访客表中提取访客的数据,每行数据有每个平台的首次访问时间;另外要做一个平台统计表,其中的一个指标统计的是各个平台近1天、7天、30天的新

    2024年02月14日
    浏览(35)
  • Hive中的explode函数、posexplode函数与later view函数

      在离线数仓处理通过HQL业务数据时,经常会遇到行转列或者列转行之类的操作,就像concat_ws之类的函数被广泛使用,今天这个也是经常要使用的拓展方法。 2.1 函数语法 2.2 函数说明 explode 函数是UDTF 函数,将hive一列中复杂的array或者map结构拆分成多行。 Explode函数是不允

    2024年04月09日
    浏览(39)
  • 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)
  • Hive 中的爆炸函数( lateral view 与 explode 用法)

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

    2024年02月12日
    浏览(45)
  • 主流数据库(SQL Server、Mysql、Oracle)通过sql实现多行数据合为一行

    1、方法一:使用 STUFF 和 FOR XML PATH 进行多行合并成一行 (1)FOR XML PATH用法 FOR XML 是 SQL Server 提供的一种功能,允许您将查询结果转换为 XML 格式。 PATH 模式则是其中一种灵活的方式来构造自定义的XML结构。 1、基本字符串连接 : 当您想从单列中提取所有行的数据并连接成一

    2024年04月10日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包