【问题标题】:Is querying against a Spark DataFrame based on CSV faster than one based on Parquet?查询基于 CSV 的 Spark DataFrame 是否比基于 Parquet 的查询更快?
【发布时间】:2017-01-25 06:18:34
【问题描述】:

我必须使用 Spark 将 CSV 文件从 HDFS 加载到 DataFrame。我想知道由 CSV 文件支持的 DataFrame 与由 parquet 文件支持的 DataFrame 是否有“性能”改进(查询速度)?

通常,我将如下所示的 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()

我想知道是否有人知道镶木地板是否有谓词下推?

对我来说,parquet 似乎有点像倒排索引,并且预计基于 parquet 的数据帧的简单计数过滤器会比基于 CSV 的数据帧更快。至于 CSV 支持的数据框,我想每次我们过滤项目时都必须进行完整的数据集扫描。

感谢您对 CSV 与 parquet-backed 数据帧查询性能的任何澄清。此外,也欢迎任何有助于加快数据帧中查询计数的文件格式。

【问题讨论】:

  • 从不,parquets 效率更高,因为它们由column 明智地存储并且由于其他因素。根据我自己的经验,最好将数据集读取为 csv,然后将其保存为 parquet,然后从中读取。
  • @AlbertoBonsanto 也许你应该回答。 “从不”是一个非常强烈的词,但通常。 JaneWayne 是的,它支持下推,尽管根据版本有一些限制,尤其是在与嵌套对象一起使用时。提示:分区、分桶和排序。
  • CSV 会比 parquet 慢,主要原因如下:1)CSV 是文本,需要逐行解析(比 JSON 好,比 parquet 差)2)指定“inferSchema”使 CSV性能更差,因为 inferSchema 将不得不读取整个文件 只是为了弄清楚架构应该是什么样子 3) 例如,1 个用 GZIP 压缩的大型 CSV 文件不会是可拆分的,因此只有 1 个执行程序具有完成所有工作 4) parquet 是面向列的,因此对列进行过滤将直接有利于 parquet 5) 压缩 parquet 中的列和块

标签: apache-spark apache-spark-sql spark-dataframe parquet


【解决方案1】:

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

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

此外,CSV 是一种基于文本的格式,它的解析效率不如二进制格式。这使得 CSV 更慢。另一方面,典型的面向列的格式不仅是二进制的,而且还允许更有效的压缩,从而导致磁盘使用量更小,访问速度更快。推荐阅读The Design and Implementation of Modern Column-Oriented Database Systems的介绍部分。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多