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

Jan*_*yne 5 apache-spark parquet apache-spark-sql spark-dataframe

我必须使用Spark into从HDFS加载CSV文件DataFrame.我想知道CSV文件支持的DataFrame与镶木地板文件支持的DataFrame是否有"性能"提升(查询速度)?

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

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

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

val df2 = sqlContext.read.parquet("hdfs://box/path/to/file.parquet")
Run Code Online (Sandbox Code Playgroud)

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

  • df1.where( "COL1 = 'some1'").COUNT()
  • df1.where("col1 ='some1'和col2 ='some2'").count()

我想知道是否有人知道是否有镶嵌的谓词 - 下推?

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

任何关于CSV与镶木地板支持的数据框查询性能的说明都表示赞赏.此外,还欢迎任何有助于加速数据帧中查询计数的文件格式.

Zol*_*tan 11

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

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

此外,CSV是一种基于文本的格式,无法像二进制格式那样有效地进行解析.这使得CSV更慢.另一方面,典型的面向列的格式不仅是二进制格式,而且还允许更有效的压缩,这导致更小的磁盘使用和更快的访问.我建议阅读" 现代面向列的数据库系统的设计和实现"的 "简介"部分.

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