hive 分组后使用近期日期数据进行缺失值填充

1、 问题描述

有产品重量表,其数据如图所示,一共为四列,分别是日期inc_day,重量weights_value,产品类型product_name,与产品等级product_level.可以看到有些日期下的重量是缺失的,此时我想要拿近期同产品类型跟等级下的重量数据进行填充,也就是第二幅图这样
原始数据
目标
在这里插入图片描述

2、 解决方法

首先对缺失与非缺失进行标记

select
    *
    ,case when weights_value = '' or weights_value is null then 0 else 1 end flag
from tmp_dm_predict.yang_product_weight

在这里插入图片描述
然后对标记分组求和得到👇结果,可以看到缺失的地方不会进行累加,无缺失的会累加.

sum(flag) over(partition by product_name,product_level order by inc_day) as cnt_sort

在这里插入图片描述
最后对求和,以及产品类型跟等级进行分组按日期排序取重量最大值,这样缺失的部分前面若有非缺失值,取最值,非缺失值则会被取到,否则继续为空,作为缺失处的值;而且不缺失的值因为会累积和,最大值只会取到自己.

max(weights_value) over(partition by cnt_sort,product_name,product_level order by inc_day) as weights_value_new

最终完整的代码如下:

select inc_day	
,weights_value	
,product_name	
,product_level
,max(weights_value) over(partition by cnt_sort,product_name,product_level order by inc_day) as weights_value_new
from
(
select
*

,sum(flag) over(partition by product_name,product_level order by inc_day) as cnt_sort
from
    (
    select
    *
    ,case when weights_value = '' or weights_value is null then 0 else 1 end flag
    from
         tmp_dm_predict.yang_product_weight
    )a2
)a3
order by product_name,product_level,inc_day ;

若要保持原表结构,可以用新重量列覆盖原重量列.

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值