- select good_bey_2023,hello_2024
- from newyear
- lateral view posexplode(split('hive, spark,flink ,line,line,so,easy',',')) t as lan_id_index, good_bey_2023
- lateral view posexplode(split('date,todate,firstday,day,day,no,bug',',')) t as day_index, hello_2024
- where lan_id_index = day_index;
复制代码 预览效果应该是
good_bey_2023hello_2024hivedatesparktodateflinkfirstdaylinedaylinedaysonoeasybug 这里用到了hive 的 lateral view 功能,这篇文章只要先容一下这个函数。
lateral view 简介
hive函数 lateral view 主要功能是将本来汇总在一条(行)的数据拆分成多条(行)成假造表,再与原表举行笛卡尔积,从而得到明细表。配合UDTF函数使用,一样平常情况下经常与explode函数搭配,explode的操纵对象(列值)是 ARRAY 大概 MAP ,可以通过 split 函数将 String 类型的列值转成 ARRAY 来处置惩罚。
- select col_A,col_B,tmp_table.tmp_col
- from table_name
- lateral view explode(split(col,'分隔符')) tmp_table as tmp_col
复制代码 使用实例
转成多行
我朋友圈的代码就是栗子:
- select good_bey_2023,hello_2024
- from newyear
- lateral view posexplode(split('hive, spark,flink ,line,line,so,easy',',')) t as lan_id_index, good_bey_2023
- lateral view posexplode(split('date,todate,firstday,day,day,no,bug',',')) t as day_index, hello_2024
- where lan_id_index = day_index;
复制代码 预览效果应该是
good_bey_2023hello_2024hivedatesparktodateflinkfirstdaylinedaylinedaysonoeasybug 汇总求和
- select good_bey_2023,count(hello_2024) hello_2024
- from newyear
- lateral view posexplode(split('hive, spark,flink ,line,line,so,easy',',')) t as lan_id_index, good_bey_2023
- lateral view posexplode(split('date,todate,firstday,day,day,no,bug',',')) t as day_index, hello_2024
- where lan_id_index = day_index
- group by good_bey_2023;
复制代码 explode(x)和posexplode()
explode(x)和posexplode() 均为炸裂函数,区别在于explode炸出一个值,posexplode不但炸出一个值还附带索引号;
如何产生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;
复制代码 如何产生开始日期到竣事日期的一连的日期?
- SELECT
- DATE_ADD(START_DATE, pos)
- FROM (
- SELECT DISTINCT
- "2023-03-13" AS START_DATE,
- "2023-03-22" AS END_DATE
- from order_detail
- ) s1 lateral VIEW posexplode(split(SPACE(DATEDIFF(END_DATE, START_DATE)), " ")) s2 AS pos, null_ele
复制代码
lateral view json_tuple(转成多列)
lateral view json_tuple 函数分析非结构化的json数据类型
工作中遇到一个数据表的存储形式,如下:
idcol1col21234{"part1" : "61", "total" : "623", "part2" : "560", "part3" : "1", "part4" : "1"}{"to_part2" : "0", "to_part4" : "0", "to_up" : "0", "to_part3" : "0", "to_part34" : "0"}4567{"part1" : "451", "total" : "89928", "part2" : "88653", "part3" : "789", "part4" : "35"}{"to_part2" : "54", "to_part4" : "6", "to_up" : "65", "to_part3" : "2", "to_part34" : "3"}7890{"part1" : "142", "total" : "351808", "part2" : "346778", "part3" : "4321", "part4" : "567"}{"to_part2" : "76", "to_part4" : "23", "to_up" : "65", "to_part3" : "14", "to_part34" : "53"} 此中col1,col2都是string类型,存放的是JSON格式的数据,JSON的key分别是:
col_namekey_listcol1[part1, part2, part3, part4, total]col2[to_part2, to_part3, to_part4, to_part34, to_up] 使用lateral view json_tuple函数 从两列中分别选出part3,part4, to_part3,to_part4的key对应的数据值:
- --使用lateral VIEW json_tuple函数解析数据
- SELECT
- id,
- to_part3,
- to_part4,
- IF(part3=0,0.0, to_part3/part3) as ratio3,
- IF(part4=0,0.0, to_part4/part4) as ratio4
- FROM
- {table_name}
- lateral VIEW json_tuple(col1, 'part3', 'part4') json1 AS part3,part4
- lateral VIEW json_tuple(col2, 'to_part3', 'to_part4') json2 AS to_part3,to_part4
- WHERE
- ...
复制代码 lateral view json_tuple VS lateral view explode
之前的文章lateral view explode函数分析非结构化的map数据类型 先容了使用explode , lateral view explode 函数来分析Map类型数据的key, value的应用。
初看下这两个例子很像,那么为什么这里使用later view json_tuple 而不是使用later view explode函数呢?
假如使用later view explode函数能不能告竣想要的效果呢?
这里的关键点就是数据结构了。
本文中的例子,col1,col2数据类型是JSON,key是固定的,每条数据都有相同的key,纵然这个key对应的值是0,也会有记载。
而上文中的例子,业务场景不一样,col1 、 col2的key不是固定的,数据类型是MAP。
col1col2{24235:r2,98766:r3}{65432:r1,35689:r2,24577:r3}{13245:r3}{34567:r1,87654:r3} 这是跟随实际应用场景而选择的数据存储类型。
比如本文中,场景类型有限,就是(part1, part2, part3, part4,to_part2, to_part3, to_part4, to_part34 )这几类,以是使用JSON的形式,穷举key来保存数据是合适的。
在电商业务中,广告触点类型非常的多(多到成百上千),而一个用户进入电商网站,实际接触到的广告触点类型却是很少的(几个到几十个),这时候假如还用JSON类型穷举所有广告触点的key,就会发现大量key的值是0,这是一个稀疏数据,这是很浪费空间的。以是,这种情况下一样平常采用MAP数据类型,只保存有实际意义的key和对应的值。
以是,使用later view explode函数能通过将每条数据拆分成key、value的形式来使用。
而假如使用later view json_tuple函数的话,假如在一条数据中没有指定想要的key,那么就会报错失败了。
outer lateral view
later view 前面还可以加上一个 outer 关键字,这是为了制止 当udtf 没有得到任何效果时最终假造效果表里丢失原数据行的问题。详细来将,由于later view 的工作原理是将原表与 udtf 产生的假造表做 inner join 操纵,以是假如 udtf 不产生任何效果时,那么对应原表的那一行也会在 inner join 操纵后消散。outer关键字就是来办理这个问题的,加上这个关键字之后实行的就是 outer join 操纵了,因此原表数据会被完全保存下来。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |