Hadoop数据存储orc与parquet格式的选择

对于orc与parquet这两种列式存储格式,网上能找到大量的介绍以及对比,此处简单总结一下:

orc VS parquet:

  • 默认情况下orc存储压缩率比parquet要高(压缩格式也可以更改,同样的压缩格式下,由于parquet格式数据schema更为复杂,所占空间略高。同snappy压缩格式,orc能达到1:3以上的压缩比,parquet则略低于1:3);

  • 一般来说,orc读取效率比parquet要高(hadoop原生存储格式,对hive支持更友好);

  • parquet支持嵌套数据格式,orc原生不支持嵌套数据类型(但可通过复杂数据类型如map间接实现,此处情况即对应第二条中的“特例”,影响性能);

  • parquet支持字段扩展,orc原生不支持字段扩展(但可手动重写读取方法实现,此处也对应第二条中的“特例”);

应用场景:

原始数据层:数据量大,统一通用化模型结构(无须嵌套数据格式,以一个String类型或map的扩展字段进行存储业务新增字段,程序读取时自行解析),读取方式多为中间数据处理程序;——  orc

数据应用层:数据模型直接关联到业务场景逻辑,需要字段可扩展性,需要嵌套数据结构(尽量以扁平式数据结构设计模型,少使用嵌套数据结构,可以更好的利用列式存储性能),数据量较小或不考虑数据量存储问题(已经是具体业务场景,相比原始数据,数据量应该是很小的,设计时保证“高内聚低耦合”)。—— parquet

总结:

使用扁平式数据结构设计模型(表),尽量避免嵌套数据结构,可以更好的利用列式存储性能;模型设计适用于退化维度,牺牲空间设计全维度的模型来提高数据查询效率(无须再进行join关联维度表)。

*注:orc格式数据读取时,兼容历史数据字段(原生不支持字段扩展性),可先读取数据,转为json,再合并数据,即可实现数据字段的兼容(此时会拉低读取性能);

当hive加载orc格式数据源时:

ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

此时自定义读取方法(兼容字段扩展性)OrcInputFormatNew()方法,提交jar至集群,add jar 至class path,注册udf函数。(未实践)

你可能感兴趣的:(大数据,HIVE)