Text/CSV
csv文件不支持块压缩,所以在Hadoop中使用压缩的CSV文件经常会带来很低的读性能。无法存储元数据。新的字段只能追加到所有字段的尾部,并且不能产出已经存在的字段。支持有限的模式演进。
JSON
能够存储元数据。不支持块压缩。第三方的JSON SerDe工具能解决这些问题。全面支持模式演进。
Avro
Avro是Hadoop平台多功能的数据存储格式。它能够存储元数据,还可以把元数据单独存储到一个文件中。支持模式演进。因为Avro可以通过定义一个新的独立的模式文件来重命名、增加、删除和修改字段的数据类型。Avro还是可以切分并支持块压缩的。
Sequence
Sequence存储数据的格式和CSV类似,但它是二进制文件。不存储元数据,如果要进行模式演进只能追加新字段。不支持块压缩。考虑到读取sequence文件的复杂性,所以sequence文件一般作为Hadoop正在运行的中间数据。
RC
Record Columnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能,但是不支持模式演进。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。
ORC
Optimized,表示优化的RC文件格式。相比RC能够更好的压缩,能够更快的查询,但还是不支持模式演进。
Parquet
能够很好的压缩,有很好的查询性能,支持有限的模式演进。但是写速度通常比较慢。这中文件格式主要是用在Cloudera Impala上面的。
综上所述,如果要存储MapReduce jobs的中间的计算数据,那么选择Sequence文件是比较理想的。如果需要很高的查询速度,就选择ORC(Hortonworks/Hive)或者Parquet(Cloudera/Impala),需要注意的是,它们一旦创建就不能修改了。如果模式经常变化,就选择Avro数据格式,但是它的查询速度比ORC或者Parquet慢。如果需要从Hadoop中提取数据到一个数据库中,可以考虑选择CSV文件格式。