关于lzop和lzo区别,以及lzop文件格式和parquet文件格式加lzo压缩区别


1.首先数仓中,通过sqoop将关系型数据库导出到hdfs上,然后hdfs数据load到hive的ods层中,在ods层 都是用lzo文件格式,例如

STORED AS
  INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

所以 sqoop输出到Hdfs上也采用对应的文件格式,所以脚本为:

$sqoop import \
--connect jdbc:mysql://hadoop102:3306/gmall \
--username root \
--password 000000 \
--target-dir /origin_data/gmall/db/$1/$do_date \
--delete-target-dir \
--query "$2 and  \$CONDITIONS" \
--num-mappers 1 \
--fields-terminated-by '\t' \
--compress \
--compression-codec lzop \
--null-string '\\N' \
--null-non-string '\\N'

可以看到 输出为 lzop,并且lzop输出后缀文件就是.lzo  而且  lzop 支持通过DistributedLzoIndexer 生成 index切片索引, 而lzo是不支持索引的

2.  dwd层数据表 是采用 parquet列式存储文件格式,并且其压缩算法采用的是lzo,会有疑问了lzo不支持切片为什么还要采用lzo

stored as parquet
TBLPROPERTIES('parquet.compression'='lzo');

实际上能不能切片是看文件格式的,parquet本身支持切片采用lzo只是它的内部在进行压缩,切片只看文件格式,parquet支持切片所以没问题的。

3. ods层为什么采用DeprecatedLzoTextInputFormat文件存储格式,而不采用parquet+lzo压缩?

实际上我认为 ods层数据目的只要是存储原始数据,很少涉及到查询,它不像dwd层会select几列进行处理信息,所以采用lzop文件会最大的压缩文件,节约空间。