提问者:小点点

优势Parquev vs Avro


Parquet是一种基于列的格式。因此,与其他格式相比,快速读取选定列被声明为Parquet的主要优势。

我决定通过Spark(Java8)在本地比较parquet和avro文件的读取速度。

例如,模型:

public class Order implements Serializable {
    private int number;
    public String client;
    private String claim;
    // getters/setters
{

我生成具有1000000条记录的相同parquet和avro文件:Number是单值整数的递增序列,Client是一组20个随机重复值,Claim是一组单值。

镶木地板的阅读:

 public void readParquet(){
    Dataset<Row> parquetFileDF = spark.read().parquet("orders_parquet");
    parquetFileDF.createOrReplaceTempView("orders");
    long beginTime2 = System.nanoTime();
    spark.sql("SELECT id FROM orders");
    long endTime2 = System.nanoTime();
    System.out.println("parquet select " + (endTime2 - beginTime2));
 }

和阅读avro:

 public void readAvro(){     
    Dataset<Row> parquetFileDF = spark.read().format("avro").load("orders_avro");
    long beginTime2 = System.nanoTime();
    parquetFileDF.select("client");
    long endTime2 = System.nanoTime();
    System.out.println("avro select " + (endTime2 - beginTime2));
 }

作为第一次尝试的结果,Spark用于读取parque文件50109200非秒(50毫秒)和avro文件…12253000纳秒(12毫秒)中选定的“客户端”项目。下一次尝试显示相同的结果。

因此,avro文件的读取速度比parquet文件快4倍。它不对应于parquet格式在读取操作中的声明优势。

或者,我可能错过了一些重要的细节?


共1个答案

匿名用户

"因此,与其他格式相比,快速读取选定列被宣布为Parquet的主要优势。"

我认为选择是这里的关键。如果我理解正确,你正在读取整个数据集,所以你无论如何都需要读取整行,这就是为什么基于列的格式对你没有帮助的原因。

例如Parquet当您有宽记录时,例如有100列,并且您只需要读取两个值。例如,在聚合期间,您不需要读取整行-这是基于行的格式的情况

您正在本地计算机上运行它,因此您可能无论如何都要从一张磁盘读取数据。在其他情况下,它也可能会有所不同,因为在基于行的表的完全扫描的情况下,您可能需要从许多磁盘中获取数据(因为您需要读取所有内容),但列式格式不是

另一件事是,在镶木地板的情况下,你正在创建临时视图,而不是

你可以在这篇文章中找到更多的细节