我必须使用Spark从HDFS加载一个CSV文件到DataFrame
。我想知道是否有一个“性能”的改善(查询速度)从一个 Dataframe 支持的CSV文件与一个支持的parquet文件?
通常,我会将如下所示的CSV文件加载到数据框中。
val df1 = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.option("inferSchema", "true")
.load
(“hdfs://box/path/to/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()
我想知道是否有人知道是否有 predicate 下推Parquet?
对我来说,parquet似乎有点像一个反向索引,并且可以预期,对于基于parquet的 Dataframe ,简单的计数过滤器会比基于CSV的 Dataframe 更快。至于CSV支持的 Dataframe ,我想每次我们过滤项目时都必须进行完整的数据集扫描。
任何关于CSV与parquet支持的 Dataframe 查询性能的澄清都是值得赞赏的。此外,任何有助于加快 Dataframe 中查询计数的文件格式也是受欢迎的。
1条答案
按热度按时间ny6fqffe1#
CSV是面向行的格式,而Parquet是面向列的格式。
通常,面向行的格式对于必须访问大部分列或仅读取一小部分行的查询更有效。另一方面,面向列的格式通常对于需要读取大部分行,但只需访问一小部分列的查询更有效。分析查询通常属于后一类,而事务查询更经常属于第一类。
此外,CSV是一种基于文本的格式,无法像二进制格式那样高效地解析。这使得CSV更慢。另一方面,典型的面向列的格式不仅是二进制的,而且还允许更有效的压缩,这导致更小的磁盘使用和更快的访问。我推荐阅读The Design and Implementation of Modern Column-Oriented Database Systems的介绍部分。
由于Hadoop生态系统用于分析查询,因此Parquet通常是比CSV更好的性能选择。