栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

[SQL]hive sql数据中间的缺少的值进行填充数据

[SQL]hive sql数据中间的缺少的值进行填充数据

目录

1.问题2.建表、添加数据,因为给的表有两张,所以建了两张表3.两张表 union all,得到一张全量表,最终处理逻辑只用这张表4.主要逻辑

4.1 使用窗口函数进行排序,主要目的是每行都复制为1;利用toA是否为 '' 进行标记并复制0或1(flag),然后累加flag标记,和值sumValue会是1,2,3...4.2 可见sumValue是顺序的1,2,3... 这样将最开始的test0112表中的值提出来标记成sumFlag,单独排序4.3 其实就这一条sql是主要的:将 4.1 和 4.2的结果进行join

1.问题

2.建表、添加数据,因为给的表有两张,所以建了两张表

test0112是 1 中的第一张表

create table test0112 (
dateA string,
fromA string,
toA string,
rateA double
) row format delimited fields terminated by 't';

test0112_all是 1 中的第二张表

create table test0112_all(
dateA string,
fromA string,
toA string,
rateA double
) row format delimited fields terminated by 't';


注:建表导初始数的时候主义是低版本还是高版本
低版本是不能指定列名, 默认是全部列,直接 values(),指定列名会报错。
高版本可以指定列名,不会报错。

3.两张表 union all,得到一张全量表,最终处理逻辑只用这张表

创建结果表并插入数据

create table test0112_result(
dateA string,
fromA string,
toA string,
rateA double
) row format delimited fields terminated by 't';

insert into test0112_result
select 
test0112_all.dateA as dateA,
test0112.fromA as fromA,
test0112.toA as toA,
test0112.rateA as rateA
from test0112_all 
left join   
test0112 
on test0112_all.dateA=test0112.dateA
order by dateA

4.主要逻辑 4.1 使用窗口函数进行排序,主要目的是每行都复制为1;利用toA是否为 ‘’ 进行标记并复制0或1(flag),然后累加flag标记,和值sumValue会是1,2,3…
select 
row_number()over() as rn,
case when rateA =='' then 0 else 1 end as flag,
dateA,
fromA,
toA,
rateA
from test0112_result

select 
sum(flag)over(order by rn) as sumValue,
dateA,
fromA,
toA,
rateA
from 
(
select 
row_number()over() as rn,
case when toA is NULL then 0 else 1 end as flag,
dateA,
fromA,
toA,
rateA
from test0112_result
) t

4.2 可见sumValue是顺序的1,2,3… 这样将最开始的test0112表中的值提出来标记成sumFlag,单独排序
select 
row_number()over() as sumFlag,
dateA,
fromA,
toA,
rateA  
from test0112

4.3 其实就这一条sql是主要的:将 4.1 和 4.2的结果进行join
select
t1.dateA,
t2.fromA,
t2.toA,
t2.rateA
from
(
select 
sum(flag)over(order by rn) as sumValue,
dateA,
fromA,
toA,
rateA
from 
(
select 
row_number()over() as rn,
case when toA is NULL then 0 else 1 end as flag,
dateA,
fromA,
toA,
rateA
from test0112_result
)t
)t1
inner join
(
select 
row_number()over() as sumFlag,
dateA,
fromA,
toA,
rateA  
from test0112_result
where rateA is not null
) as t2
on t1.sumValue=t2.sumFlag
order by t1.dateA


其余的Oder by 的优化需要的自己研究吧,大致思路是这样解决的。。。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/707671.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号