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

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

    一般不需要设置。

  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/wakerwang/p/9504398.html
Copyright © 2011-2022 走看看