基于CSV查询基于CSV的Spark DataFrame是否比基于Parquet的更快?

时间:2016-09-16 23:19:37

标签: apache-spark apache-spark-sql spark-dataframe parquet

我必须使用Spark将{CSV}文件从HDFS加载到DataFrame。我想知道是否有一个"表现"从CSV文件支持的DataFrame与镶木地板文件支持的改进(查询速度)?

通常,我会将如下所示的CSV文件加载到数据框中。

val df1 = sqlContext.read
 .format("com.databricks.spark.csv")
 .option("header", "true")
 .option("inferSchema", "true")
 .load("hdfs://box/path/to/file.csv")

另一方面,加载镶木地板文件(假设我已解析CSV文件,创建模式并将其保存到HDFS)如下所示。

val df2 = sqlContext.read.parquet("hdfs://box/path/to/file.parquet")

现在我想知道以下查询时间之类的操作是否会受到影响和/或不同。

  • df1.where(" COL1 =' some1'&#34)。COUNT()
  • df1.where(" col1 =' some1' col2 =' some2'")。count()

我想知道是否有人知道镶木地板是否存在谓词下推?

对我来说,看起来镶木地板有点像倒置索引,并且可以预期,对于基于镶木地板的数据框而言,简单的计数过滤器比基于CSV的数据框更快。至于支持CSV的数据框,我想每次我们过滤项目时都必须进行完整的数据集扫描。

对CSV与木地板支持数据框查询性能的任何说明均表示赞赏。此外,欢迎任何有助于加快数据框中查询计数的文件格式。

1 个答案:

答案 0 :(得分:10)

CSV是面向行的格式,而Parquet是面向列的格式。

通常,面向行的格式对于必须访问大多数列或仅读取一小部分行的查询更有效。另一方面,面向列的格式通常对于需要读取大多数行的查询更有效,但只需要访问一小部分列。分析查询通常属于后一类,而事务性查询通常属于第一类。

此外,CSV是一种基于文本的格式,无法像二进制格式那样有效地进行解析。这使得CSV更慢。另一方面,典型的面向列的格式不仅是二进制格式,而且还允许更有效的压缩,这导致更小的磁盘使用和更快的访问。我建议您阅读The Design and Implementation of Modern Column-Oriented Database Systems的简介部分。

由于Hadoop生态系统用于分析查询,因此对于Hadoop应用程序而言,Parquet通常是比CSV更好的性能选择。