2016-09-16 53 views
3

我必須使用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與實木複合支持的數據框查詢性能的任何說明。此外,任何有助於加快數據幀查詢計數的文件格式也是受歡迎的。

+1

永遠不會,'parquets'更高效,因爲它們是通過'column'明智存儲的,並且還有其他因素。根據我自己的經驗,最好將數據集作爲csv讀取,然後將其保存爲實木複合地板,然後從中讀取它。 –

+0

@AlbertoBonsanto也許你應該回答。 「永不」是一個非常強大的詞,但通常。 JaneWayne Yup,它支持下推,雖然根據版本有一些限制,特別是在使用嵌套對象時。提示:分區,分區和排序。 – zero323

+0

由於以下幾個主要原因,CSV將比實木複合地板更慢:1)CSV是文本,需要逐行解析(比JSON更好,比實木複合地板差) 2)指定「inferSchema」會使CSV性能更糟,因爲inferSchema將不得不讀取整個文件_只是爲了弄清楚模式應該看起來像什麼 3)1個用GZIP壓縮的大型CSV文件不會被分割,所以只有1個執行者必須完成所有工作 4)parquet是列面向對象,因此對列進行過濾將直接影響實木複合地板的使用效果 5)壓實鑲木地板中的柱和塊 – Garren

回答

4

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

通常,面向行的格式對於必須訪問大多數列或僅讀取一部分行的查詢來說效率更高。另一方面,面向列的格式通常對於需要讀取大部分行的查詢更有效,但只需訪問一部分列。分析查詢通常屬於後一類,而事務查詢更常見於第一類。

此外,CSV是基於文本的格式,不能像二進制格式那樣有效地進行解析。這使得CSV更慢。另一方面,典型的面向列的格式不僅是二進制的,而且還允許更高效的壓縮,這導致更小的磁盤使用和更快的訪問。我建議閱讀The Design and Implementation of Modern Column-Oriented Database Systems的介紹部分。

由於Hadoop生態系統適用於分析查詢,因此對於Hadoop應用程序,Parquet通常是比CSV更好的性能選擇。