zoukankan      html  css  js  c++  java
  • Hive基础(12):Hive语法(6) DDL(3) hive动态分区

     往hive分区表中插入数据时,如果需要创建的分区很多,比如以表中某个字段进行分区存储,则需要复制粘贴修改很多sql去执行,效率低。因为hive是批处理系统,所以hive提供了一个动态分区功能,其可以基于查询参数的位置去推断分区的名称,从而建立分区。

       1.创建一个单一字段分区表

    1 hive>
    2    create table dpartition(id int ,name string )
    3    partitioned by(ct string  );
       2.往表里装载数据,并且动态建立分区,以city建立动态分区
    复制代码
     1 hive>
     2  hive.exec.dynamici.partition=true;  #开启动态分区,默认是false
     3  set hive.exec.dynamic.partition.mode=nonstrict; #开启允许所有分区都是动态的,否则必须要有静态分区才能使用。
     4  insert overwrite table dpartition
     5  partition(ct)
     6  select id ,name,city from  mytest_tmp2_p; 
     7  
     8 要点:因为dpartition表中只有两个字段,所以当我们查询了三个字段时(多了city字段),所以系统默认以最后一个字段city为分区名,因为分区表的
     9 分区字段默认也是该表中的字段,且依次排在表中字段的最后面。所以分区需要分区的字段只能放在后面,不能把顺序弄错。如果我们查询了四个字段的话,则会报
    10 错,因为该表加上分区字段也才三个。要注意系统是根据查询字段的位置推断分区名的,而不是字段名称。
    11 hive>--查看可知,hive已经完成了以city字段为分区字段,实现了动态分区。
    12 hive (fdm_sor)> show partitions dpartition;
    13 partition
    14 ct=beijing
    15 ct=beijing1
    复制代码

    注意:使用,insert...select 往表中导入数据时,查询的字段个数必须和目标的字段个数相同,不能多,也不能少,否则会报错。但是如果字段的类型不一致的话,则会使用null值填充,不会报错。而使用load data形式往hive表中装载数据时,则不会检查。如果字段多了则会丢弃,少了则会null值填充。同样如果字段类型不一致,也是使用null值填充。

    3.多个分区字段时,实现半自动分区(部分字段静态分区,注意静态分区字段要在动态前面)

    复制代码
     1 1.创建一个只有一个字段,两个分区字段的分区表
     2 hive (fdm_sor)> create table ds_parttion(id int ) 
     3               > partitioned by (state string ,ct string );
     4 2.往该分区表半动态分区插入数据 
     5 hive>
     6  set hive.exec.dynamici.partition=true;
     7  set hive.exec.dynamic.partition.mode=nonstrict;
     8  insert overwrite table ds_parttion
     9  partition(state='china',ct)  #state分区为静态,ct为动态分区,以查询的city字段为分区名
    10  select id ,city from  mytest_tmp2_p; 
    11  
    12 3.查询结果显示:
    13 hive (fdm_sor)> select *  from ds_parttion where state='china'
    14               > ;
    15 ds_parttion.id  ds_parttion.state       ds_parttion.ct
    16 4       china   beijing
    17 3       china   beijing
    18 2       china   beijing
    19 1       china   beijing
    20 4       china   beijing1
    21 3       china   beijing1
    22 2       china   beijing1
    23 1       china   beijing1
    24  
    25 hive (fdm_sor)> select *  from ds_parttion where state='china' and ct='beijing';
    26 ds_parttion.id  ds_parttion.state       ds_parttion.ct
    27 4       china   beijing
    28 3       china   beijing
    29 2       china   beijing
    30 1       china   beijing
    31  
    32 hive (fdm_sor)> select *  from ds_parttion where state='china' and ct='beijing1';
    33 ds_parttion.id  ds_parttion.state       ds_parttion.ct
    34 4       china   beijing1
    35 3       china   beijing1
    36 2       china   beijing1
    37 1       china   beijing1
    38 Time taken: 0.072 seconds, Fetched: 4 row(s)
    复制代码
    4.多个分区字段时,全部实现动态分区插入数据
    复制代码
    1  set hive.exec.dynamici.partition=true;
    2  set hive.exec.dynamic.partition.mode=nonstrict;
    3  insert overwrite table ds_parttion
    4  partition(state,ct)
    5  select id ,country,city from  mytest_tmp2_p; 
    6 注意:字段的个数和顺序不能弄错。
    复制代码

    5.动态分区表的属性

      使用动态分区表必须配置的参数 :

        set hive.exec.dynamic.partition =true(默认false),表示开启动态分区功能
        set hive.exec.dynamic.partition.mode = nonstrict(默认strict),表示允许所有分区都是动态的,否则必须有静态分区字段

     动态分区相关的调优参数:

        set  hive.exec.max.dynamic.partitions.pernode=100 (默认100,一般可以设置大一点,比如1000)

           表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错。

       set hive.exec.max.dynamic.partitions =1000(默认值) 

           表示一个动态分区语句可以创建的最大动态分区个数,超出报错

       set hive.exec.max.created.files =10000(默认) 全局可以创建的最大文件个数,超出报错。

     
     

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/14167320.html

  • 相关阅读:
    例题6-8 Tree Uva548
    例题6-7 Trees on the level ,Uva122
    caffe Mac 安装
    Codeforces Round #467 (Div. 1) B. Sleepy Game
    Educational Codeforces Round37 E
    Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons
    Good Bye 2017 E. New Year and Entity Enumeration
    Good Bye 2017 D. New Year and Arbitrary Arrangement
    Codeforces Round #454 D. Seating of Students
    浙大紫金港两日游
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14167320.html
Copyright © 2011-2022 走看看