zoukankan      html  css  js  c++  java
  • Hive实现自增列的两种方法

      多维数据仓库中的维度表和事实表一般都需要有一个代理键,作为这些表的主键,代理键一般由单列的自增数字序列构成。Hive没有关系数据库中的自增列,但它也有一些对自增序列的支持,通常有两种方法生成代理键:使用row_number()窗口函数或者使用一个名为UDFRowSequence的用户自定义函数(UDF)。
      假设有维度表tbl_dim和过渡表tbl_stg,现在要将tbl_stg的数据装载到tbl_dim,装载的同时生成维度表的代理键。
    • 用row_number()函数生成代理键
    [sql] view plain copy
     
    1. insert into tbl_dim    
    2. select row_number() over (order by tbl_stg.id) + t2.sk_max, tbl_stg.*    
    3. from tbl_stg   
    4. cross join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;   
            上面语句中,先查询维度表中已有记录最大的代理键值,如果维度表中还没有记录,利用coalesce函数返回0。然后使用cross join连接生成过渡表和最大代理键值的笛卡尔集,最后使用row_number()函数生成行号,并将行号与最大代理键值相加的值,作为新装载记录的代理键。
    • 用UDFRowSequence生成代理键
    [sql] view plain copy
     
    1. add jar hdfs:///user/hive-contrib-2.0.0.jar;    
    2. create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.udfrowsequence';   
    3.   
    4. insert into tbl_dim    
    5. select row_sequence() + t2.sk_max, tbl_stg.*    
    6. from tbl_stg   
    7. cross join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;  
            hive-contrib-2.0.0.jar中包含一个生成记录序号的自定义函数udfrowsequence。上面的语句先加载JAR包,然后创建一个名为row_sequence()的临时函数作为调用UDF的接口,这样可以为查询的结果集生成一个自增伪列。之后就和row_number()写法类似了,只不过将窗口函数row_number()替换为row_sequence()函数。

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53893174
  • 相关阅读:
    Java设计模式系列之策略模式
    设计模式系列之热身
    算术表达式系列之后缀表达式求值
    算术表达式系列之中缀表达式转后缀表达式
    Maven下使用Junit对Spring进行单元测试
    Windows命令行使用总结(持续更新)
    Eclipse中web项目部署至Tomcat步骤
    MyBatis保存完整日期的解决方法
    Redis(一)源码安装
    【集成学习】sklearn中xgboost模块中plot_importance函数(绘图--特征重要性)
  • 原文地址:https://www.cnblogs.com/fujian-code/p/8795570.html
Copyright © 2011-2022 走看看