查询基于 CSV 的 Spark DataFrame 是否比基于 Parquet 的查询更快?
Is querying against a Spark DataFrame based on CSV faster than one based on Parquet?
我必须使用 Spark 从 HDFS 加载一个 CSV 文件到 DataFrame
。我想知道由 CSV 文件支持的 DataFrame 与由 parquet 文件支持的 DataFrame 相比是否有 "performance" 改进(查询速度)?
通常,我将如下所示的 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")
现在我想知道像以下查询时间这样的操作是否会受到影响and/or不同。
- df1.where("col1='some1'").count()
- df1.where("col1='some1' and col2='some2'").count()
我想知道是否有人知道 parquet 是否有谓词下推?
对我来说,parquet 似乎有点像倒排索引,预计简单的计数过滤器对于基于 parquet 的数据帧比基于 CSV 的数据帧更快。至于 CSV 支持的数据框,我认为每次过滤项目时都必须进行完整的数据集扫描。
感谢任何关于 CSV 与 parquet 支持的数据帧查询性能的说明。此外,也欢迎任何有助于加快数据帧查询计数的文件格式。
CSV 是一种面向行的格式,而 Parquet 是一种面向列的格式。
通常,面向行的格式对于必须访问大部分列或仅读取一小部分行的查询更有效。另一方面,面向列的格式通常对于需要读取大部分行但只需要访问一小部分列的查询更有效。分析查询通常属于后一类,而交易查询通常属于第一类。
此外,CSV 是一种基于文本的格式,其解析效率不如二进制格式。这使得 CSV 更慢。另一方面,典型的面向列的格式不仅是二进制的,而且还允许更有效的压缩,从而导致更小的磁盘使用和更快的访问。我建议阅读 The Design and Implementation of Modern Column-Oriented Database Systems.
的简介部分
由于 Hadoop 生态系统用于分析查询,对于 Hadoop 应用程序,Parquet 通常是比 CSV 更好的性能选择。
我必须使用 Spark 从 HDFS 加载一个 CSV 文件到 DataFrame
。我想知道由 CSV 文件支持的 DataFrame 与由 parquet 文件支持的 DataFrame 相比是否有 "performance" 改进(查询速度)?
通常,我将如下所示的 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")
现在我想知道像以下查询时间这样的操作是否会受到影响and/or不同。
- df1.where("col1='some1'").count()
- df1.where("col1='some1' and col2='some2'").count()
我想知道是否有人知道 parquet 是否有谓词下推?
对我来说,parquet 似乎有点像倒排索引,预计简单的计数过滤器对于基于 parquet 的数据帧比基于 CSV 的数据帧更快。至于 CSV 支持的数据框,我认为每次过滤项目时都必须进行完整的数据集扫描。
感谢任何关于 CSV 与 parquet 支持的数据帧查询性能的说明。此外,也欢迎任何有助于加快数据帧查询计数的文件格式。
CSV 是一种面向行的格式,而 Parquet 是一种面向列的格式。
通常,面向行的格式对于必须访问大部分列或仅读取一小部分行的查询更有效。另一方面,面向列的格式通常对于需要读取大部分行但只需要访问一小部分列的查询更有效。分析查询通常属于后一类,而交易查询通常属于第一类。
此外,CSV 是一种基于文本的格式,其解析效率不如二进制格式。这使得 CSV 更慢。另一方面,典型的面向列的格式不仅是二进制的,而且还允许更有效的压缩,从而导致更小的磁盘使用和更快的访问。我建议阅读 The Design and Implementation of Modern Column-Oriented Database Systems.
的简介部分由于 Hadoop 生态系统用于分析查询,对于 Hadoop 应用程序,Parquet 通常是比 CSV 更好的性能选择。