【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

hive列转行时保证顺序 (hive列转行函数)

用户投稿2024-03-30热门资讯41

在Hive中,列转行是一种常见的数据处理操作,通常用中的多个字段拆分成多行数据,以便更好地进行数据分析和处理。在进行列转行操作时,保证顺序是非常重要的,因为数据的顺序会直接影响到后续的数据分析结果和计算。

Hive提供了多种列转行函数,如EXPLODE、LATERAL VIEW、STACK等,这些函数可以帮助用户实现列转行操作。在使用这些函数时,需要注意以下几点来保证列转行时的顺序:

1. 确保数据顺序一致:在进行列转行操作之前,需要确保原始数据的顺序是一致的。如果原始数据的顺序不一致,那么转行后的数据也会出现混乱,导致分析结果错误。

2. 使用ORDER BY子句:在使用列转行函数时,可以通过ORDER BY子句来指定数据的排序规则,以保证转行后的数据顺序与原始数据一致。例如,可以在EXPLODE函数中使用ORDER BY来指定字段排序。

hive列转行时保证顺序 (hive列转行函数) 第1张

3. 调整数据结构:有时候,原始数据的结构并不适合直接进行列转行操作,需要对数据结构进行调整。可以通过子查询或其他数据处理方式来调整数据结构,以便更好地进行列转行操作。

4. 进行数据验证:在完成列转行操作后,需要对转行后的数据进行验证,确保数据顺序正确且没有丢失任何信息。可以通过对比原始数据和转行后的数据来进行验证。

保证列转行时的顺序是非常重要的,只有保证数据顺序一致并正确处理数据结构,才能确保列转行后的数据准确性和可靠性。在实际操作中,需要结合具体的数据情况和使用场景来选择合适的列转行函数和处理方式,以达到最佳的数据处理效果。


hive关于行转列,列转行的使用

行转列: 定义:就是把形如 id--------- name 1--------- a 2--------- a 3--------- a 4--------- a 的数据转换为 id -------------name 1,2,3,4 --------- a 这里把四行的数据变成了由一行显示,这就是行转列。 首先要用到的是collect_set或者collect_list,前者去重,后者不去重,一般配合group使用,能把形如: id---------name 1 ---------a 2 ---------a 3 ---------a 4 ---------a 转换为 id--------- name [1,2,3,4]---------a 然后需要用到的是concat_ws函数,这个函数需要传递指定分隔符,以及字符串或者字符串数组。 能起到把多个字符串拼接到一起的作用。 形如: id--------- name [1,2,3,4]---------a 通过concat_ws(,,[1,2,3,4])转换为 id--------- name 1,2,3,4---------a 连起来就完成了行转列 一般sql为: 列转行 定义:就是把形如 id -------------name 1,2,3,4 --------- a 的数据转换为 id--------- name 1--------- a 2--------- a 3--------- a 4--------- a 这里把一行的数据变成了由四行显示,这就是列转行。 首先要用到split函数,这个行数可以把字符串按照指定的规则切分为字符串数组。 形如: id--------- name 1,2,3,4---------a 通过split(1,2,3,4,,)转换为 id--------- name [1,2,3,4]---------a 然后是explode函数,这个行数可以把数组的每个元素转换为一行。 形如 id [1,2,3,4] 通过explode([1,2,3,4] )转换为 id 1 2 3 4 最后为了拼接其它字段,还需要用到lateral view把explode获得的行当虚拟表来用。 使用方法为 lateral view explode(split([1,2,3,4] , ,)) tmptable as new_id ; 其中new_id元素为转换为行后的字段名。 把以上综合起来就完成了列转行 一般sql为:

Hive / ClickHouse 行转列函数 collect_set() / groupUniqArray()

Hive中的 collect_set() 函数功能,将某一列中的value取值转换成一个 set ; 在 ClickHouse 中可以通过 groupUniqArray() 来实现。

数据分析课程笔记 - 20 - HIVE 核心技能之窗口函数

大家好呀,这节课我们学习 Hive 核心技能中最难的部分——窗口函数。窗口函数我们之前在学 MySQL 的时候有学过一些,但是只学了三个排序的窗口函数。这节课我们会学习更多的窗口函数,包括累计计算、分区排序、切片排序以及偏移分析。

在正式学习之前,我们需要先明确一下窗口函数和GROUP BY分组的区别。二者在功能上有相似之处,但是它们存在本质区别。

1. 分组会改变表的结构,而窗口函数不会改变表的结构。比如原表有10行数据,分成两组后只有两行,而窗口函数仍然返回十行数据。 2. 分组只能查询分组后的字段,包括分组字段(组名)和聚合函数字段。而窗口函数对查询字段没有限制,也就是可以查询原表的任意字段,再加上窗口函数新增的一列值。

好啦,现在让我们一起进入窗口函数的世界吧~

本节课主要内容:

1、累计计算窗口函数 (1)sum(…) over(……) (2)avg(…) over(……) (3)语法总结 2、分区排序窗口函数 (1)row_number() (2)rank() (3)dense_rank() 3、切片排序窗口函数 (1)ntile(n) over(……) 4、偏移分析窗口函数 5、重点练习

大家在做报表的时候,经常会遇到计算截止某月的累计数值,通常在EXCEL里可以通过函数来实现。

那么在HiveSQL里,该如何实现这种累计数值的计算呢?那就是利用窗口函数!

关于窗口函数的几点说明:

需求分析 :既然要进行按月累计,我们就先要把2018年的每笔交易时间转换成月并按月分组聚合计算,得出一个2018年每月支付金额总合表,再基于这张表用窗口函数进行累计计算。

2018年每月支付金额总和表:

再用窗口函数进行月度累计:

年度进行汇总。

这个需求比需求1多了一个需求,那就是年度汇总。那我们只需要在上个需求的子查询中加一个 year 字段即可。

说明:

1、over 中的 partition by 起到了窗口内将数据分组的作用。事实上,加上partition by之后,可以理解为分成了多个窗口,并在每个窗口内进行累加计算或者分区。

如果不加 partition by 的话,运行结果就是这样单纯按月份进行分组的:

2、order by 按照什么顺序进行累加,升序ASC、降序DESC,默认是升序。

大家看股票的时候,经常会看到这种K线图,里面经常用到的就是7日、30日移动平均的趋势图,那如何使用窗口函数来计算移动平均值呢?

需求分析 :这个需求要求每个月近三个月的移动平均支付金额,这里我们要用到一个新知识点,在窗口函数 avg over 的 order by 之后加一句rows between 2 preceding and current row来设定计算移动平均的范围,这个语句的含义就是包含本行及前两行。其他部分的写法跟前面的需求类似,先取出2018年每个月的支付金额总和,再用窗口函数求移动平均。

注意:

sum(…A…) over(partition by …B… order by …C… rows between …D1… and …D2…) avg(…A…) over(partition by …B… order by …C… rows between…D1… and …D2…)

A:需要被加工的字段名称 B:分组的字段名称 C:排序的字段名称 D:计算的行数范围

rows between unbounded preceding and current row ——包括本行和之前所有的行rows between current row and unbounded following ——包括本行和之后所有的行rows between 3 preceding and current row ——包括本行以内和前三行rows between 3 preceding and 1 following ——从前三行到下一行(5行)

max(……) over(partition by …… order by …… rows between ……and ……)

min(……) over(partition by …… order by …… rows between ……and ……)

row_number() 、rank()、dense_rank()

用法:这三个函数的作用都是返回相应规则的排序序号

row_number() over(partition by …A… order by …B… )

rank() over(partition by …A… order by …B… )

dense_rank() over(partition by …A… order by …B… )

A:分组的字段名称

B:排序的字段名称

注意:这3个函数的括号内是不加任何字段名称的!

row_number :它会为查询出来的每一行记录生成一个序号,依次排序且不会重复。

rank&dense_rank :在各个分组内, rank()是跳跃排序,有两个第一名时接下来就是第三名, dense_rank()是连续排序,有两个第一名时仍然跟着第二名。

实例练习:

再眼熟一下 user_trade 的表结构:

需求分析 :先限定时间范围,然后根据 user_name 进行分组,接着选出 分组去重后的 user_name,并计算每个用户 goods_category 的数量(记得 distinct 去重),再然后就是用窗口函数对 goods_category 的数量进行排序,当然选择哪一种排序方法要看具体要求,这里我们可以三种方法都试一下看看结果:

注意 :窗口函数中的 order by 字段不能用 select 中字段的重命名,因为二者是同时执行的。

需求分析 : 先用窗口函数将2019年每个用户的支付总金额算出来并进行排序,再以此作为子查询,从中取出排名在第10、20、30名的用户名、支付总金额以及排名次序。企业一般会使用 dense_rank 进行排序,所以我们这里直接用 dense_rank。

2019年每个用户的支付总金额排名:

2019年支付金额排名在第10、20、30名的用户:

ntile(n) over(partition by …A… order by …B… )

n:切分的片数 A:分组的字段名称 B:排序的字段名称

需求分析 :这个需求很简单,把需求5第一步的排序窗口函数变成切片即可。注意时间筛选条件变成2019年1月。

需求分析 : 排名前10%,也就是一共分成10组,取第1组。那么我们先切片分组:

然后再取第一组:

说明:Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。

在实际应用当中,若要用到取今天和昨天的某字段差值时,Lag和Lead函数的应用就显得尤为重要。当然,这种操作可以用表的自连接实现,但是LAG和LEAD与left join、right join等自连接相比,效率更高,SQL语句更简洁。

lag(exp_str,offset,defval) over(partion by ……order by ……) lead(exp_str,offset,defval) over(partion by ……order by ……)

lag()函数示例:

lead()函数示例:

需求分析: 先要从 user_trade 表中取出每个用户的支付时间,把每个用户放到一个窗口中,按照支付时间进行排序,取出偏移列: lead(dt,1,dt) over(partition by user_name order by dt)。接着基于该子查询,筛选出时间间隔大于100天的用户,并计算数量。

注意 : 如果上面偏移分析函数写成lead(dt,1,dt)就不用加后面的 dt is not null 了,因为有默认值的话,间隔就是0,肯定是不满足条件的。

需求分析:

第一步 :这个需求要用到 user_trade 和 user_info 两张表,前者取支付时间和金额,后者取城市和性别。先对这两张表基于 user_name 进行左连接,并取出相应字段,用窗口函数进行分组排序:

这一步的运行结果是这样的:

第二步 :基于上述结果取出TOP3:

需求分析:

第一步 :这个需求同样要用到两张表 user_refund 和 user_info。我们先把每个退款用户的退款金额和手机品牌取出来,并用窗口函数进行切片排序,25%就是分成4片:

注意 :这里之所以要加WHERE dt is not null是因为 user_refund 是一个分区表,分区表要对分区字段进行限制,否则 hive 会报错。

第二步 :选择前25%,也就是第一片:

最后补充一个从 hive 导出结果数据的命令:

以上就是这节课的全部内容了。做完整个练习,真的半条命都没了。窗口函数果然很难,不过掌握方法、多多练习,学会拆解需求,一步一步来做,就能明显降低难度。希望以后有机会能用到这么复杂的技能,哈哈~!

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

hive列转行时保证顺序 (hive列转行函数) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
你上次访问网站的时间为:24-05-20,15:48:39 你第15访问网站的时间为:24-05-20 15:48:40