上傳txt文件到hdfs模聋,txt文件大小是74左右既鞠。
這里提醒一下晕翠,是不是說(shuō)pzrquet加lzo可以把數(shù)據(jù)壓縮到這個(gè)地步,因?yàn)槲业臏y(cè)試數(shù)據(jù)存在大量重復(fù)担映。所以下面使用parquet和lzo的壓縮效果特別好废士。
創(chuàng)建hive表,使用parquet格式存儲(chǔ)數(shù)據(jù)
不可以將txt數(shù)據(jù)直接加載到parquet的表里面蝇完,需要?jiǎng)?chuàng)建臨時(shí)的txt存儲(chǔ)格式的表
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 ",";
然后在創(chuàng)建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;
加載數(shù)據(jù)
# 先將數(shù)據(jù)加載到emp_txt
load data inpath '/test/data' overwrite into table emp_txt partition(dt='2020-01-01',hour='01');
#再?gòu)膃mp_txt將數(shù)據(jù)加載到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';
可以看到這里生成了兩個(gè)文件官硝,加起來(lái)5.52M,可見(jiàn)大大的將原始的txt進(jìn)行了壓縮
下面我們使用parquet加lzo的方式四敞,來(lái)看看數(shù)據(jù)的壓縮情況
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');
加載數(shù)據(jù)到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';
數(shù)據(jù)相比較于僅僅使用parquet泛源,數(shù)據(jù)被進(jìn)一步的壓縮了。但是這里提醒一下忿危,是不是說(shuō)pzrquet加lzo可以把數(shù)據(jù)壓縮到這個(gè)地步达箍,因?yàn)槲业臏y(cè)試數(shù)據(jù)存在大量重復(fù)。
綜上總結(jié)
txt文本文件铺厨,在使用parquet加壓縮格式缎玫,相比較于僅僅使用parquet,可以更進(jìn)一步的將數(shù)據(jù)壓縮解滓。
拓展
1.parquet壓縮格式
parquet格式支持有四種壓縮赃磨,分別是lzo,gzip洼裤,snappy邻辉,uncompressed,在數(shù)據(jù)量不大的情況下,四種壓縮的區(qū)別也不是太大值骇。
2.hive的分區(qū)是支持層級(jí)分區(qū)
?也就是分區(qū)下面還可以有分區(qū)的,如上面的 partitioned by (dt string,hour string) 在插入數(shù)據(jù)的時(shí)候使用逗號(hào)分隔莹菱,partition(dt='2020-01-01',hour='01')
3.本次測(cè)試中,一個(gè)74M的文件吱瘩,使用在insert overwrite ... select 之后道伟,為什么會(huì)產(chǎn)生兩個(gè)文件
首先要聲明一下,我的hive使用的執(zhí)行引擎是tez使碾,替換了默認(rèn)的mapreduce執(zhí)行引擎蜜徽。
我們看一下執(zhí)行頁(yè)面,這里可以看到形成了兩個(gè)map票摇,這里是map-only拘鞋,一般數(shù)據(jù)的加載操作都是map-only的,所以矢门,有多少的map掐禁,就會(huì)產(chǎn)生幾個(gè)文件。
可以是hadoop的mapreduce不是128M的splitsize嗎颅和,這個(gè)文件才74M,為什么會(huì)產(chǎn)出兩個(gè)map,這里我們看看tez的執(zhí)行日志
??從圖片可以看出缕允,這里是tez把74M的文件分成了兩個(gè)峡扩,這里的52428800是50M,也就是這里的splitsize不是hadoop的mr的默認(rèn)的128M障本,而是這里的50M教届,所以,74M的文件會(huì)被分為兩個(gè)驾霜,一個(gè)是50M案训,一個(gè)是24M,.然后我們看上面的emp_parquet的文件,一個(gè)式3.7M粪糙,也是1.8M强霎,正好和50M和24M的比例是對(duì)應(yīng)的。
所以蓉冈,一切事情都是有原因的城舞,這里的splitsize是50M,才會(huì)導(dǎo)致形成兩個(gè)文件的寞酿。但是我沒(méi)有找到這哥tez的splitsize的具體配置是什么家夺,以后找到的話,再進(jìn)行補(bǔ)充伐弹。
本篇文章就到這里拉馋。