SQL实现一组数据相乘

背景描述

在做数据处理的时候,尤其是复利累积的时候,有时候会有这样一宗场景,通过某种条件找到一列数据[X1,X2,X3...Xn],然后想要求y=X1X2X3...Xn,这个粗看时没有办法通过SQL实现的,因为SQL里面的分组汇总函数就那么几个sum,avg,max,min,count没有办法直接求一组数据连续相乘。

解决办法

后来一个数学功底很好的同事给出了一个办法,现在分享给大家,原理如下:

代码:

exp(sum(ln(growth_rate))

** 注:growth_rate是各期复利增长率。

反思

在数据处理的时候对数运算其实是很有用,目前发现的小用途进行一下总结。

1.缩小数据差异。

对数可以将一组差异化很大的数据缩小数据间,比如在柱状图数据展示的时候,有时候高低柱的差距太大(数十倍)会使得低柱小得不可见,这个时候如果用对数将数据log处理一下,在数据标注的时候再通过exp逆运算回来就能正确展示了。

2.运算规则转换,化乘除为加减。比如刚才的例子就是讲乘法规则转换为加法规则。

转载于:https://my.oschina.net/huhaicool/blog/1829986

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Hive中,数据倾斜是一个常见的问题,尤其是在一些聚合操作(如GROUP BY、JOIN等)中,某些key的数据量极大,而其他key的数据量很小,导致某些任务处理的数据量远远大于其他任务,从而导致任务执行时间过长,甚至执行失败。这种情况下,我们可以采取以下几种方法来解决数据倾斜问题。 1. 使用随机数函数和分桶技术 可以使用Hive中的rand()函数生成一个0~1之间的随机数,并将其与桶的数量相乘,然后向下取整得到桶的编号,将原始数据按照随机分配到若干个桶中。然后对每个桶内的数据进行单独的统计,并将各个桶内的统计结果合并起来,得到总体的统计结果。这样可以将原始数据分散到各个桶中,从而避免了数据倾斜的问题。 2. 使用Map-side Aggregation Map-side Aggregation是一种在Map端对数据进行聚合的技术,可以避免Reduce端的数据倾斜问题。在使用Map-side Aggregation时,需要将数据按照聚合key进行分组,并在Map端对每个组内的数据进行聚合操作,然后将聚合结果输出到HDFS上的中间文件中。最后,在Reduce端对中间文件进行合并操作,得到最终的聚合结果。 3. 使用Combiner Combiner是一种在Map端对数据进行局部聚合的技术,可以减少Reduce端的数据量,从而避免数据倾斜问题。在使用Combiner时,需要将数据按照聚合key进行分组,并在Map端对每个组内的数据进行局部聚合操作,然后将聚合结果输出到Reduce端进行合并操作。这样可以将Reduce端需要处理的数据量减少到最小。 4. 使用Bucketing Bucketing是一种将数据按照特定的key分散到若干个桶中的技术,可以避免数据倾斜问题。在使用Bucketing时,需要在创建表时指定bucket数和bucket列,然后将数据按照bucket列进行分桶操作。这样可以将数据分散到若干个桶中,并且每个桶中的数据量相对均衡。 综上所述,以上几种方法都可以有效地解决Hive中的数据倾斜问题,具体采用哪种方法需要根据具体的情况进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值