zoukankan      html  css  js  c++  java
  • hive分区

    Hive中的表分区

    Hive中的表分区比较简单,就是将同一组数据放到同一个HDFS目录下,当查询中过滤条件指定了某一个分区值时候,只将该分区对应的目录作为Input,从而减少MapReduce的输入数据,提高查询效率。

    创建分区表

    CREATE EXTERNAL TABLE t_1 (

    id INT,

    ip STRING

    ) COMMENT ‘分区表’

    PARTITIONED BY (month STRING, day STRING)

    ROW FORMAT DELIMITED

    FIELDS TERMINATED BY ‘,’

    STORED AS textfile;

    • 在创建表时候,使用PARTITIONED BY关键字来指定该表为分区表,后面括号中指定了分区的字段和类型,分区字段可以有多个,在HDFS中对应多级目录。
    • 比如,上面的表t_1分区month=’2015-06’,day=’2015-06-15’对应HDFS上的路径为:/user/hive/warehouse/default.db/t_1/month=2015-06/day=2015-06-15/,当查询中指定了month=’2015-06’ AND day=’2015-06-15’,MapReduce直接从该目录中读取数据,如果只指定了month=’2015-06’,那么MapReduce将/month=2015-06/下所有的子目录都作为Input。

    添加分区

    • 使用INSERT添加分区:

    往分区中追加数据:

    INSERT INTO TABLE t_1 PARTITION (month = ‘2015-06′,day = ‘2015-06-15′)

    SELECT * FROM dual;

    覆盖分区数据:

    INSERT overwrite TABLE t_1 PARTITION (month = ‘2015-06′,day = ‘2015-06-15′)

    SELECT * FROM dual;

    • 使用ALTER TABLE添加分区:

    ALTER TABLE t_1 ADD PARTITION (month = ‘2015-06′,day = ‘2015-06-15′) location ‘hdfs://namenode/tmp/l1/month=2015-06/day=2015-06-15/';

    查看分区对应的HDFS路径

    • 使用命令 show partitions t_1; 查看表的所有分区:

    hive> show partitions t_1

    OK

    month=2015-01/day=2015-01-25

    month=2015-01/day=2015-01-31

    month=2015-02/day=2015-02-15

    month=2015-02/day=2015-02-28

    month=2015-03/day=2015-03-15

    month=2015-03/day=2015-03-31

    • 使用desc formatted t_1 partition (month = ‘2015-01’ , day = ‘2015-01-25′);

    查看该分区的详细信息,包括该分区在HDFS上的路径:

    Location:               hdfs://namenode/user/hive/warehouse/default.db/t_1/month=2015-01/day=2015-01-25/

     删除分区

    可以使用 ALTER TABLE t_1 DROP PARTITION (month = ‘2015-01’, day = ‘2015-01-25’);

    删除一个分区;

    同内部表和外部表,如果该分区表为外部表,则分区对应的HDFS目录数据不会被删除。

     动态分区

    使用动态分区需要注意设定以下参数:

    • hive.exec.dynamic.partition

    默认值:false

    是否开启动态分区功能,默认false关闭。

    使用动态分区时候,该参数必须设置成true;

    • hive.exec.dynamic.partition.mode

    默认值:strict

    动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。

    一般需要设置为nonstrict

    • hive.exec.max.dynamic.partitions.pernode

    默认值:100

    在每个执行MR的节点上,最大可以创建多少个动态分区。

    该参数需要根据实际的数据来设定。

    比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。

    • hive.exec.max.dynamic.partitions

    默认值:1000

    在所有执行MR的节点上,最大一共可以创建多少个动态分区。

    同上参数解释。

    • hive.exec.max.created.files

    默认值:100000

    整个MR Job中,最大可以创建多少个HDFS文件。

    一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。

    • hive.error.on.empty.partition

    默认值:false

    当有空分区生成时,是否抛出异常。

    一般不需要设置。

  • 相关阅读:
    OC之runtime面试题(一)
    OC之runtime的(isKindOfClass和isMemberOfClass)
    OC之runtime(super)
    OC中的__block修饰符
    iOS录音及播放
    webpack5升级过程遇到的一些坑?
    (转)iOS工具--CocoaPods 安装使用总结
    iOS学习--NSObject详解
    iOS学习--通过ipa包如何获取图片资源
    ‘A downloaded software component is corrupted and will not be used. ‘ while publish an iOS app to apple store via Xcode
  • 原文地址:https://www.cnblogs.com/wakerwang/p/9504398.html
Copyright © 2011-2022 走看看