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;