我必须使用Spark从HDFS加载CSV文件到DataFrame
。我想知道是否有"演出"。改进(查询速度)从一个由CSV文件支持的数据帧vs一个由parquet文件支持的数据帧?
通常,我将如下所示的CSV文件加载到数据帧中。
val df1 = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.option("inferSchema", "true")
.load
("hdfs://盒/道路//file.csv")
另一方面,加载一个parquet文件(假设我已经解析了CSV文件,创建了一个模式,并将其保存到HDFS)如下所示:val df2 = sqlContext.read.parquet("hdfs://box/path/to/file.parquet")
现在我想知道像下面这样的操作查询时间是否会受到影响和/或不同。
-
df1.where("col1='some1'").count()
-
df1.where("col1='some1' and col2='some2'").count()
我想知道是否有人知道是否有谓词下推拼花?
对我来说,似乎parquet有点像反向索引,并且可以预期,对于基于parquet的数据帧,计数的简单过滤器会比基于CSV的数据帧更快。至于csv支持的数据帧,我认为每次我们过滤项目时都必须进行完整的数据集扫描。
对CSV和拼花支持的数据帧查询性能的任何澄清都是值得赞赏的。此外,任何有助于加快数据帧查询计数的文件格式也是受欢迎的。
CSV是面向行的格式,而Parquet是面向列的格式。
通常面向行的格式对于必须访问大多数列或仅读取一小部分行的查询更有效。另一方面,面向列的格式对于需要读取大部分行,但只需要访问一小部分列的查询通常更有效。分析查询通常属于后一类,而事务性查询更经常属于第一类。
另外,CSV是一种基于文本的格式,不能像二进制格式那样有效地解析。这使得CSV更慢。另一方面,典型的面向列的格式不仅是二进制的,而且还允许更有效的压缩,从而减少磁盘使用量和提高访问速度。我推荐阅读《现代面向列的数据库系统的设计与实现》的引言部分。
由于Hadoop生态系统是用于分析查询的,对于Hadoop应用程序来说,Parquet通常是比CSV更好的性能选择。