1. 程式人生 > 其它 >parquet列儲存本身自帶壓縮 配合snappy或者lzo等可以進行二次壓縮

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的具體配置是什麼,以後找到的話,再進行補充。