2016-09-16 52 views
3

我必须使用Spark将HDFS中的CSV文件加载到DataFrame中。我想知道是否有一个由CSV文件支持的DataFrame与由实木复合地址文件支持的DataFrame有“性能”提升(查询速度)?是否比基于Parquet的基于CSV的Spark 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'”)。COUNT()
  • df1.where( “COL1 = 'some1' 和COL2 = 'some2'”)。COUNT()

我想知道如果有人知道是否有拼花地板的谓词下推?

对我来说,似乎镶木地板有点像一个倒排索引,并且可以预计,基于镶木地板的数据框的简单过滤器比CSV上的简单过滤器要快。至于CSV支持的数据框,我会想象每次我们筛选项目时都必须进行全面的数据集扫描。

赞赏有关CSV与实木复合支持的数据框查询性能的任何说明。此外,任何有助于加快数据帧查询计数的文件格式也是受欢迎的。

+1

永远不会,'parquets'更高效,因为它们是通过'column'明智存储的,并且还有其他因素。根据我自己的经验,最好将数据集作为csv读取,然后将其保存为实木复合地板,然后从中读取它。 –

+0

@AlbertoBonsanto也许你应该回答。 “永不”是一个非常强大的词,但通常。 JaneWayne Yup,它支持下推,虽然根据版本有一些限制,特别是在使用嵌套对象时。提示:分区,分区和排序。 – zero323

+0

由于以下几个主要原因,CSV将比实木复合地板更慢:1)CSV是文本,需要逐行解析(比JSON更好,比实木复合地板差) 2)指定“inferSchema”会使CSV性能更糟,因为inferSchema将不得不读取整个文件_只是为了弄清楚模式应该看起来像什么 3)1个用GZIP压缩的大型CSV文件不会被分割,所以只有1个执行者必须完成所有工作 4)parquet是列面向对象,因此对列进行过滤将直接影响实木复合地板的使用效果 5)压实镶木地板中的柱和块 – Garren

回答

4

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

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

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

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