parquet列存儲本身自帶壓縮 配合snappy或者lzo等可以進行二次壓縮


上傳txt文件到hdfs,txt文件大小是74左右。

這里提醒一下,是不是說parquet加lzo可以把數據壓縮到這個地步,因為我的測試數據存在大量重復。所以下面使用parquet和lzo的壓縮效果特別好。


 

 

創建hive表,使用parquet格式存儲數據

不可以將txt數據直接加載到parquet的表里面,需要創建臨時的txt存儲格式的表

CREATE TABLE emp_txt (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)
partitioned BY(dt string,hour string)
row format delimited fields terminated by ",";

然后在創建parquet的表

CREATE TABLE emp_parquet (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)
partitioned BY(dt string,hour string)
row format delimited fields terminated by ","
stored as PARQUET;

加載數據

# 先將數據加載到emp_txt
load data inpath '/test/data'  overwrite into table emp_txt partition(dt='2020-01-01',hour='01');
#再從emp_txt將數據加載到emp_parquet里面
insert overwrite table emp_parquet 
select  empno,ename,job,mgr,hiredate,sal,comm,deptno 
from emp_txt where dt='2020-01-01'  AND hour='01';

可以看到這里生成了兩個文件,加起來5.52M,可見大大的將原始的txt進行了壓縮

 

 下面我們使用parquet加lzo的方式,來看看數據的壓縮情況

CREATE TABLE emp_parquet_lzo (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)
partitioned by (dt string,hour string)
row format delimited fields terminated by ","
stored as PARQUET
tblproperties('parquet.compression'='lzo');

加載數據到emp_parquet_lzo

insert overwrite table emp_parquet_lzo partition (dt='2020-01-01',hour='01')
select  empno,ename,job,mgr,hiredate,sal,comm,deptno 
from emp_txt where dt='2020-01-01'  AND hour='01';

數據相比較於僅僅使用parquet,數據被進一步的壓縮了。但是這里提醒一下,是不是說pzrquet加lzo可以把數據壓縮到這個地步,因為我的測試數據存在大量重復。

 

 

綜上總結

txt文本文件,在使用parquet加壓縮格式,相比較於僅僅使用parquet,可以更進一步的將數據壓縮。

拓展

1.parquet壓縮格式

parquet格式支持有四種壓縮,分別是lzo,gzip,snappy,uncompressed,在數據量不大的情況下,四種壓縮的區別也不是太大。

2.hive的分區是支持層級分區

 也就是分區下面還可以有分區的,如上面的 partitioned by (dt string,hour string) 在插入數據的時候使用逗號分隔,partition(dt='2020-01-01',hour='01')

3.本次測試中,一個74M的文件,使用在insert overwrite ... select 之后,為什么會產生兩個文件

首先要聲明一下,我的hive使用的執行引擎是tez,替換了默認的mapreduce執行引擎。
我們看一下執行頁面,這里可以看到形成了兩個map,這里是map-only,一般數據的加載操作都是map-only的,所以,有多少的map,就會產生幾個文件。


 

 

可以是hadoop的mapreduce不是128M的splitsize嗎,這個文件才74M,為什么會產出兩個map,這里我們看看tez的執行日志
  從圖片可以看出,這里是tez把74M的文件分成了兩個,這里的52428800是50M,也就是這里的splitsize不是hadoop的mr的默認的128M,而是這里的50M,所以,74M的文件會被分為兩個,一個是50M,一個是24M,.然后我們看上面的emp_parquet的文件,一個式3.7M,也是1.8M,正好和50M和24M的比例是對應的。

 

 

所以,一切事情都是有原因的,這里的splitsize是50M,才會導致形成兩個文件的。但是我沒有找到這哥tez的splitsize的具體配置是什么,以后找到的話,再進行補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM