上傳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的比例是對應的。
從圖片可以看出,這里是tez把74M的文件分成了兩個,這里的52428800是50M,也就是這里的splitsize不是hadoop的mr的默認的128M,而是這里的50M,所以,74M的文件會被分為兩個,一個是50M,一個是24M,.然后我們看上面的emp_parquet的文件,一個式3.7M,也是1.8M,正好和50M和24M的比例是對應的。

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