我必须使用Spark将HDFS中的CSV文件加载到DataFrame
中。我想知道是否有一个由CSV文件支持的DataFrame与由实木复合地址文件支持的DataFrame有“性能”提升(查询速度)?是否比基于Parquet的基于CSV的Spark DataFrame更快地查询?
通常,我将如下所示的CSV文件加载到数据框中。
val df1 = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.option("inferSchema", "true")
.load("hdfs://box/path/to/file.csv")
在另一方面,加载拼花文件(假设我已经分析的CSV文件,创建的模式,并将其保存到HDFS)如下所示。
val df2 = sqlContext.read.parquet("hdfs://box/path/to/file.parquet")
现在我想知道是否像下面的查询时间的操作会受到影响和/或不同。
- df1.where( “COL1 = 'some1'”)。COUNT()
- df1.where( “COL1 = 'some1' 和COL2 = 'some2'”)。COUNT()
我想知道如果有人知道是否有拼花地板的谓词下推?
对我来说,似乎镶木地板有点像一个倒排索引,并且可以预计,基于镶木地板的数据框的简单过滤器比CSV上的简单过滤器要快。至于CSV支持的数据框,我会想象每次我们筛选项目时都必须进行全面的数据集扫描。
赞赏有关CSV与实木复合支持的数据框查询性能的任何说明。此外,任何有助于加快数据帧查询计数的文件格式也是受欢迎的。
永远不会,'parquets'更高效,因为它们是通过'column'明智存储的,并且还有其他因素。根据我自己的经验,最好将数据集作为csv读取,然后将其保存为实木复合地板,然后从中读取它。 –
@AlbertoBonsanto也许你应该回答。 “永不”是一个非常强大的词,但通常。 JaneWayne Yup,它支持下推,虽然根据版本有一些限制,特别是在使用嵌套对象时。提示:分区,分区和排序。 – zero323
由于以下几个主要原因,CSV将比实木复合地板更慢:1)CSV是文本,需要逐行解析(比JSON更好,比实木复合地板差) 2)指定“inferSchema”会使CSV性能更糟,因为inferSchema将不得不读取整个文件_只是为了弄清楚模式应该看起来像什么 3)1个用GZIP压缩的大型CSV文件不会被分割,所以只有1个执行者必须完成所有工作 4)parquet是列面向对象,因此对列进行过滤将直接影响实木复合地板的使用效果 5)压实镶木地板中的柱和块 – Garren