关于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文件会最大的压缩文件,节约空间。