impala row_id 的生成方法 ,用row_number() 。
若要给impala的维度表添加一个row_id 可以用row_number() over(partition by column1 order by column2 desc) as row_id
最近处理impala数据时,源数据比较乱,没有规范。例如有份数据包含代码、名称、分类等;源数据里一个代码可能有多个不同的名称、分类等;把这份数据处理下,获取所有的代码,以及相应代码对应最多的那个名称、分类等(其他字段以此类推),将数据加工到另一张表里。
因为有可能相应代码对应的最多名称或其他属性的个数一样(一个代码有3个A名称,3个B名称,最多名称的个数都是3),所以可以给数据(代码,名称,个数)添加一个行号再去关联代码 最多名称个数(其中某个行号的最多名称个数) 获得代码对应的最多数量的名称。
with name1 as (select row_number() over(partition by code order by count(*) desc) as row_id, code, name, count(*) as cnt1 from ods.cd_info group by code ,name ) ,
name2 as (select code,max(cnt1) cnt2 from name1 group by code),
NAME as (select name1.code,name1.name from name1 join name2 on name1.code=name2.code and name1.cnt1=name2.cnt2 where name1.row_id=1 ) ,
type1 as (select row_number() over(partition by code order by count(*) desc) as row_id, code, type_id, count(*) as cnt1 from ods.cd_info group by code ,type_id ) ,
type2 as (select code,max(cnt1) cnt2 from type1 group by code) ,
TYPE as (select type1.code,type1.type_id from type1 join type2 on type1.code=type2.code and type1.cnt1=type2.cnt2 where type1.row_id=1)
select a.code,b.name,c.type_id
from ods.cd_info a
join NAME b on b.code=a.code
join TYPE c on c.code=a.code
group by a.code,b.name,c.type_id
impala处理数据时,获取代码、名称等字段, 添加一个唯一row_id标识;要求后面更新数据时,row_id 不能变,也用row_number() 来生成 row_id。
往 cd_info_all 表里 插入 一份包含row_id字段的数据。
with newdata as ( select code, name ),
alldata as ( select newdata.*,
olddata.row_id,
-- 根据code判断,1 新数据:插入 0 旧数据:更新
if(olddata.code is null,1,0) as is_new
from newdata
full join ods.cd_info_all olddata on newdata.code= olddata.code ),
updatedata as(
select
alldata.row_id,
alldata.code,
alldata.name
from alldata where is_new = 0 ) ,
insertdata as (
select
row_number() over(order by rand())+maxid+10000000 as row_id,
alldata.code,
alldata.name
from alldata
cross join (select coalesce(max(row_id),0) maxid from updatedata) b where is_new = 1 )
select
row_id,
code,
name
from updatedata
union all
select
row_id,
code,
name
from insertdata