【发布时间】: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