hive:函数:lateral view的使用(炸开函数)和 row_number() 函数打行号

lateral view的使用(炸开函数):

hive:函数:lateral view的使用(炸开函数)和 row_number() 函数打行号_第1张图片

 

使用示例:

select 
        ChargeName,
        regexp_replace(regexp_replace(sub, '\\{', ''), '\\}', '') managebranch,
        StartDate 
FROM (
    SELECT
        *
    FROM
        ods_aimsen_base_regionhistories lateral VIEW explode(split(ManageBranchNos,'\\}\\{')) tmp
        AS sub
    ) tmp_a


   

炸开后效果:

hive:函数:lateral view的使用(炸开函数)和 row_number() 函数打行号_第2张图片

 

示例1:

row_number() 函数打行号:

SELECT
    id,
    age,
    name,
    sex from 
    (
        SELECT
            id,
            age,
            name,
            sex,
            row_number() over(partition BY sex ORDER BY age DESC) AS rank
        FROM
            t_rownumber
     ) tmp
WHERE
    rank<=2;
 

 

示例2:

SELECT
    *
FROM
    (
        SELECT
            workno,
            employeename,
            brand,
            null,
            null,
            amount,
            effectivedate,
            isleave,
            leavedate,
            addtime,
            managebranchnos ,
            chargename,
            startdate,
            row_number() over(partition BY workno,employeename,brand,office,team,amount,effectivedate,isleave,leavedate,addtime,managebranchnos ORDER BY startdate DESC) AS rank
        FROM
            (
                SELECT
                    *
                FROM
                    dws.dws_resumeachieve_t_result_tmp02 tmp02
                LEFT JOIN
                    dws.dws_resumeachieve_t_regionhistories_tmp01 tmp_a
                ON
                    tmp02.managebranchnos=tmp_a.managebranch
                WHERE
                tmp02.addtime is not null and tmp02.addtime!='null' and tmp02.managebranchnos is not null  and  tmp02.managebranchnos !='null' and tmp02.leavedate is not null and tmp02.leavedate!='null' and
                --tmp02.addtime is not null and
                    tmp02.addtime>tmp_a.startdate
                    ) a ) tmp

你可以加上筛选条件:

WHERE
    rank is null or rank=1;

效果:

hive:函数:lateral view的使用(炸开函数)和 row_number() 函数打行号_第3张图片

 

lateral view explode函数的坑 

在正常解析一个有值的字符串时,用lateral view explode是完全ok的,但是,当遇到该字符串为空时,如果在使用该函数,就会导致该条记录消失。

lateral view explode这个UDTF转换的Array为空的记录,自动被过滤掉了,如果想要保留记录,需要加上outer关键字。

如:

 select ... from  表名 lateral view outer explode(需炸开的字段)tmp as sub

参考:

https://blog.csdn.net/jarry_cm/article/details/90402833

你可能感兴趣的:(hive)