我计划在我的Hadoop相关项目中使用一个Hadoop文件格式。 我了解到,parquet对基于列的查询高效,而avro适用于全扫描或需要所有列的数据时!
在我继续选择其中一个文件格式之前,我想了解其中一个比另一个的缺点/不足之处。 有人可以用简单的语言解释一下吗?
Avro是一种基于行的格式。如果您希望以整体的形式检索数据,则可以使用Avro。
Parquet是一种基于列的格式。如果您的数据包含大量列但只对其中的一部分感兴趣,则可以使用Parquet。
HBase在涉及频繁更新数据时非常有用。 Avro在检索方面很快,而Parquet则更快。
如果您还没有决定,我建议您开始编写数据的Avro模式。一旦完成,选择使用Avro容器文件还是Parquet文件就像是简单地交换例如,
job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());
为了
job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());
Parquet格式在写入方面似乎要更加计算密集型--例如,需要RAM进行缓冲和CPU进行数据排序等,但它应该可以减少I/O、存储和传输成本,并且特别适用于类似SQL(例如Hive或SparkSQL)查询中只涉及一部分列的高效读取。
在一个项目中,由于架构太复杂并且嵌套层次过多(源自一些相当分层的面向对象类),导致了1000多个Parquet列,最终我放弃了Parquet转而使用Avro容器。进而,我们的行组变得非常宽而浅,这意味着在处理每个组的最后一列的少量行之前需要花费很长时间。
我还没有太多机会将Parquet用于更规范/合理的数据,但我了解到如果使用得当,它可以带来显着的性能改进。
Avro
Parquet
你的理解是正确的。实际上,在我们的数据仓库中进行数据迁移时,我们遇到了类似的情况。我们选择了Parquet而不是Avro,因为我们得到的磁盘节省量几乎是使用AVro得到的两倍。此外,查询处理时间比Avro快得多。但是,是的,我们的查询基于聚合、基于列的操作等,因此Parquet可预见地成为明显的赢家。
我们正在使用来自CDH发行版的Hive 0.12。你提到你在Hive+Parquet方面遇到了问题,是什么问题?我们没有遇到任何问题。
谢谢!