hive实现自增列的两种方法

hive没有关系数据库中的自增列(oracle中rownum),但它对自增序列有支持,通常有两种方法生成代理键:

1)使用row_number()窗口函数

2)使用一个名为UDFRowSequence的用户自定义函数(UDF)

假设现在有维度表tbl_dim和过渡表tbl_stg,现在要将tbl_stg的数据装载到tbl_dim,装载的同时生成维度表的代理键。

方法一(使用row_number()生成代理键):

    insert into tbl_dim 

        select row_number() over (order by tbl_stg.id) t2.sk_max, tbl_stg.* from tbl_stg.*

        cross join 

        (select coalesce(max(sk),0) sk_max from tbl_dim) t2;

上述sql解释:

    先查询维度表中已有记录最大的代理键值,如果维度表中还没有记录,利用coalesce函数返回0;然后使用cross join连接生成过渡表和最大代理键值的笛卡尔集,最后使用row_number()函数生成行号,并将行号与最大代理键值相加的值,作为新装载记录的代理键。

方法二(使用UDFRowSequence生成代理键):

add jar hdfs:///user/hive-contrib-2.0.0.jar;

create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.udfrowsequence';

insert into tbl_dim

    select row_sequence() + t2.sk_max, tbl_stg.* from tbl_stg

    cross join 

    (select coalesce(max(sk),0) sk_max from tbl_dim) t2;

上述sql解释:

    hive-contrib-2.0.0.jar中包含一个生产记录序号的自定义函数udfrowsequence。先加载jar包,然后创建一个名为row_sequence()的临时函数作为调用UDF的接口,这样可以为查询的结果集生成一个自增伪列。之后就跟row_number()函数写法类似了,不过是将窗口函数row_number()替换为row_sequence()函数。









你可能感兴趣的:(hive)