1. 程式人生 > >Hive中使用LZO壓縮的方式

Hive中使用LZO壓縮的方式

1.建立表的時候指定為lzo格式

CREATE EXTERNAL TABLE foo (
     columnA string,
     columnB string
) PARTITIONED BY (date string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY "\t"
STORED AS
INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
LOCATION '/path/xxxx/foo';

2.對於已經建立好的表,可以使用alter語句,修改為lzo儲存格式。
ALTER TABLE foo
SET FILEFORMAT 
INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat";


3.當使用insert語句往lzo表裡插入資料時,需要加入下面兩個引數:

SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;

4.查詢使用count(*)有資料,但是select * 是沒有資料的?
若發生將一個使用LZO壓縮過的表資料匯入一個沒有被壓縮過表內,
查詢將出現這種狀況,hdfs目錄下明明有資料,count(*)有資料總量,但是select就是查詢不出來,
具體原因:
表的結構是未壓縮過的,但是資料是壓縮過的,通過select(此處查詢的方法跟表的結構有關係)查詢壓縮過的結果,肯定不會顯示,

具體解決辦法:
使用select的時候指定對應的壓縮方法就可以查詢出來壓縮過的資料,類似於如下:

SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;