文章目录
  1. parquet压缩hive表
    1. 1. 应用场景
    2. 2. 压缩过程
      1. 1. 建立新表

[TOC]

parquet压缩hive表

1. 应用场景

原表为txt格式,占用硬盘空间太大,hive支持 parquet格式,所以将原表更新为利用parquet格式,来压缩该表占用的硬盘空间。

2. 压缩过程

1. 建立新表

show create table TABLE_NAME ; 将原表的字段结构拷贝出来,然后建立新表,以dwd_estore_md_goods表为例,语句如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
CREATE TABLE `dwd_estore_md_goods_tmp`(  
`row_id` double,
`code` string,
`name` string,
`goods_type` string,
`length` double,
`width` double,
`height` double,
`sale_prop` string,
`unit_id` double,
`unit` string,
`brand_id` double,
`brand` string,
`prd_grp_id` double,
`prd_grp_desc` string,
`prd_series_id` double,
`prd_series_desc` string,
`come_from` double,
`origin_id` string,
`origin_created_date` string,
`origin_upd_date` string,
`origin_delete_flag` string,
`active_flag` string,
`created_date` string,
`created_by` string,
`last_upd_date` string,
`last_upd_by` string,
`volume` double,
`volume_uom_code` string,
`gross_weight_number` double,
`weight_unit` string,
`is_crust_flag` string,
`is_village_product` string,
`mdm_code` string,
`prd_grp_code` string,
`brand_code` string,
`prd_img_uri` string,
`high_end_products` string,
`origin_code` string,
`remark` string)
PARTITIONED BY (
`pt` string)
STORED AS PARQUET
TBLPROPERTIES (
'parquet.compression'='SNAPPY'
)

主要是设置STORED AS PARQUET和TBLPROPERTIES。
STORED AS PARQUET是利用PARQUET来进行储存,TBLPROPERTIES中设置的是利用SNAPPY压缩方式来压缩PARQUET文件。

###2. 开启动态分区
动态分区的意义在于分区值可以设置分区值为变量,即可以利用表中的一个字段来进行分区,插到对应分区中。首先需要在窗口中开启动态分区(每个窗口需要设置一次):

1
2
3
4
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=4000;
set hive.exec.max.dynamic.partitions.pernode=4000;

各个语句含义如下:

  • hive.exec.dynamic.partition=true

    1
    2
    3
    4
    5
      默认值:false
    描述:是否允许动态分区
    ```

    * hive.exec.dynamic.partition.mode=nonstrict

    默认值:strict
    描述:strict是避免全分区字段是动态的,必须有至少一个分区字段是指定有值的

    1
    * hive.exec.max.dynamic.partitions.pernode=100

    默认值:100
    描述:each mapper or reducer可以创建的最大动态分区数

    1
    2

    * hive.exec.max.dynamic.partitions=1000

    默认值:1000
    描述:一个DML操作可以创建的最大动态分区数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48

    ### 3.插入数据
    从原表中插入数据到新表中,还以该表为例,语句如下:

    ```sql
    insert overwrite table dwd_estore_md_goods_tmp partition (`pt`)
    select
    row_id ,
    code ,
    name ,
    goods_type ,
    length ,
    width ,
    height ,
    sale_prop ,
    unit_id ,
    unit ,
    brand_id ,
    brand ,
    prd_grp_id ,
    prd_grp_desc ,
    prd_series_id ,
    prd_series_desc ,
    come_from ,
    origin_id ,
    origin_created_date ,
    origin_upd_date ,
    origin_delete_flag ,
    active_flag ,
    created_date ,
    created_by ,
    last_upd_date ,
    last_upd_by ,
    volume ,
    volume_uom_code ,
    gross_weight_number ,
    weight_unit ,
    is_crust_flag ,
    is_village_product ,
    mdm_code ,
    prd_grp_code ,
    brand_code ,
    prd_img_uri ,
    high_end_products ,
    origin_code ,
    remark ,
    `pt` as pt
    From q3wz4iux3v.dwd_estore_md_goods;

该语句主要是列的最后一行,以原表中的列名as为新表中的分区字段名来进行动态分区,此处我们就是利用原表的pt来动态分区的,所以我们 `pt` as pt。

###4.改表名
插入到新表后,可以select count(1)一下看一下数据对应量和分区和原表一样不,若一样的话,可以先删除原表(也可以先暂时存下原表以防出错),然后更换新表名为原表名。

1
alter table dwd_estore_md_goods_tmp rename to dwd_estore_md_goods。
文章目录
  1. parquet压缩hive表
    1. 1. 应用场景
    2. 2. 压缩过程
      1. 1. 建立新表