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

    Hive 分区介绍:

    hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition)

    hive中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash分区、混合分区等)。

    分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说在表的数据文件中实际上并不保存分区列的信息与数据。

    分区改变了HIVE 对数据存储的组织方式,hive 会创建反应分区结构的子目录,就是那些实际的目录名称。

    对数据进行分区,最主要的原因就是为了更快的查询。

    可以通过,show partitions 表名  查看表中存在的所有分区,

    或者

    describe extended  表名

    desc 表名

    动态分区:

    当需要创建非常多的分区的时候,Hive提供了动态分区的功能:

    可以基于查询的参数,推断出需要创建分区的名称。

    INSERT OVERWRITE TABLE emp PARTITION (country, state)  SELECT ..., ... , se.cnty, se.st
    
    FROM staged_emp se;
    
     
    

      

    需要注意,字段值和分区之间的关系是根据位置而不是字段名称来进行匹配的。

    动态分区也可以和静态分区混合使用,但是静态分区必须出现在动态分区之前。

    举例:使用动态分区要先设置hive.exec.dynamic.partition参数值为true,默认值为false;

    动态分区的使用方法很简单,假设我想向stat_date='20110728'这个分区下面插入数据,至于province插入到哪个子分区下面让数据库自己来判断,那可以这样写:

    insert overwrite table partition_test partition(stat_date='20110728',province)
    
    select member_id,name,province from partition_test_input where stat_date='20110728';

     

    stat_date叫做静态分区列,province叫做动态分区列。

    select子句中需要把动态分区列按照分区的顺序写出来,静态分区列不用写出来。这样stat_date='20110728'的所有数据,会根据province的不同分别插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夹下,如果源数据对应的province子分区不存在,则会自动创建,非常方便,

    而且避免了人工控制插入数据与分区的映射关系存在的潜在风险。

    注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区:

     

    insert overwrite table partition_test partition(stat_date,province='liaoning')
    
    select member_id,name,province from partition_test_input where province='liaoning';
    

      

    FAILED: SemanticException [Error 10094]: Line 1:49 Dynamic partition cannot be the parent of a static partition ''liaoning''

    问题:一般是建表的时候,分区表的顺序出现了问题,静态分区一定要再动态分区的前面。 

    动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数hive.exec.dynamic.partition.mode :
     
    set hive.exec.dynamic.partition.mode;
    hive.exec.dynamic.partition.mode=strict
    

      

  • 相关阅读:
    P/Invoke .NET调用win32API
    怎么将字节流转换成汉字?(硬件printf的汉字怎么解析?)
    个人电脑配置FTP服务器,四张图搞定。项目需要,并自己写了个客户端实现下载和上传的功能!
    C# 中Datetime类用法总结
    C#环境datagidview添加删除操作
    C#环境下,文本框翻屏,怎么一直显示当前插入的内容!!!!!!!!!!!!!!!!
    eclipse下提交job时报错mapred.JobClient: No job jar file set. User classes may not be found.
    SQL Server连接数据库失败,可能的问题!
    写好的mapreduce程序,编译,打包,得到最后的jar包! 验证jar包 ! 整体流程
    在虚拟机环境下,电脑间拷贝配置好的伪分布式Hadoop环境,出现namenode不能启动的问题!
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/10715451.html
Copyright © 2011-2022 走看看