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格式在读取操作中的声明优势。
或者,我可能错过了一些重要的细节?
"因此,与其他格式相比,快速读取选定列被宣布为Parquet的主要优势。"
我认为选择是这里的关键。如果我理解正确,你正在读取整个数据集,所以你无论如何都需要读取整行,这就是为什么基于列的格式对你没有帮助的原因。
例如Parquet当您有宽记录时,例如有100列,并且您只需要读取两个值。例如,在聚合期间,您不需要读取整行-这是基于行的格式的情况
您正在本地计算机上运行它,因此您可能无论如何都要从一张磁盘读取数据。在其他情况下,它也可能会有所不同,因为在基于行的表的完全扫描的情况下,您可能需要从许多磁盘中获取数据(因为您需要读取所有内容),但列式格式不是
另一件事是,在镶木地板的情况下,你正在创建临时视图,而不是
你可以在这篇文章中找到更多的细节