parquet列儲存本身自帶壓縮 配合snappy或者lzo等可以進行二次壓縮
阿新 • • 發佈:2021-06-23
上傳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 ) partitionedBY(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 "," storedas 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的具體配置是什麼,以後找到的話,再進行補充。