zoukankan      html  css  js  c++  java
  • hive动态分区和静态分区

    转载:https://www.jianshu.com/p/5dbbaea8ff41

    一)hive中支持两种类型的分区:

    静态分区SP(static partition)
    动态分区DP(dynamic partition)
    静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在SQL执行时才能决定。

    二)实战演示如何在hive中使用动态分区

    1、创建一张分区表,包含两个分区dt和ht表示日期和小时

    CREATE TABLE partition_table001 
    (
        name STRING,
        ip STRING
    )
    PARTITIONED BY (dt STRING, ht STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY "	";
    

    2、启用hive动态分区,只需要在hive会话中设置两个参数:

    set hive.exec.dynamic.partition=true;
    set hive.exec.dynamic.partition.mode=nonstrict;
    

    3、把partition_table001表某个日期分区下的数据load到目标表partition_table002 使用静态分区时,必须指定分区的值,如:

    create table if not exists partition_table002 like partition_table001;
    insert overwrite table partition_table002 partition (dt='20150617', ht='00') select name, ip from partition_table001 where dt='20150617' and ht='00';
    

    此时我们发现一个问题,如果希望插入每天24小时的数据,则需要执行24次上面的语句。而动态分区会根据select出的结果自动判断数据改load到哪个分区中去。
    4、使用动态分区

    insert overwrite table partition_table002 partition (dt, ht) select * from partition_table001 where dt='20150617';
    

    hive先获取select的最后两个位置的dt和ht参数值,然后将这两个值填写到insert语句partition中的两个dt和ht变量中,即动态分区是通过位置来对应分区值的。原始表select出来的值和输出partition的值的关系仅仅是通过位置来确定的,和名字并没有关系,比如这里dt和st的名称完全没有关系。
    只需要一句SQL即可把20150617下的24个ht分区插到了新表中。

     



  • 相关阅读:
    Spring 学习笔记
    Java Web整合开发(33) -- SSH和SSJ
    2、常用操作
    jsonp使用
    PHP curl 封装 GET及POST方法很不错的
    浅谈CSRF攻击方式 转
    谷歌插件请求ci 解决CI框架的Disallowed Key Characters错误提示
    phpstorm10.0.3 下载与激活
    Mysql全文搜索match against的用法
    CentOS 6.4下编译安装MySQL 5.6.14 (转)
  • 原文地址:https://www.cnblogs.com/to-here/p/14623636.html
Copyright © 2011-2022 走看看