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
    评论
Hive中,可以使用COALESCE函数来填充缺失。COALESCE函数接受一系列表达式作为参数,并返回第一个非空。因此,你可以将缺失替换为指定的默认。例如,假设你有一个表test0112,其中包含了一些缺失,你可以使用COALESCE函数来填充这些缺失。 以下是填充缺失Hive查询示例: ``` SELECT COALESCE(dateA, 'default_value') AS dateA, COALESCE(fromA, 'default_value') AS fromA, COALESCE(toA, 'default_value') AS toA, COALESCE(rateA, 'default_value') AS rateA FROM test0112; ``` 在上述示例中,我们使用COALESCE函数将缺失的dateA、fromA、toA和rateA列的替换为'default_value'。 另外,你也可以使用CASE语句来进行缺失填充。例如,你可以根据特定的条件对缺失进行替换。以下是使用CASE语句进行缺失填充的示例: ``` SELECT CASE WHEN dateA IS NULL THEN 'default_value' ELSE dateA END AS dateA, CASE WHEN fromA IS NULL THEN 'default_value' ELSE fromA END AS fromA, CASE WHEN toA IS NULL THEN 'default_value' ELSE toA END AS toA, CASE WHEN rateA IS NULL THEN 'default_value' ELSE rateA END AS rateA FROM test0112; ``` 在上述示例中,我们使用CASE语句根据不同的条件对缺失进行了替换。 请根据你的具体情况选择适合你的方法进行缺失填充。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [[SQL]hive sql数据中间的缺少的进行填充数据](https://blog.csdn.net/MyNameIsWangYi/article/details/122460319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值