2015-04-22 56 views
8

我正在加載高維Parquet文件,但只需要幾列。我當前的代碼看起來像:如何在Spark中更有效地加載Parquet文件(pySpark v1.2.0)

dat = sqc.parquetFile(path) \ 
      .filter(lambda r: len(r.a)>0) \ 
      .map(lambda r: (r.a, r.b, r.c)) 

我發生了什麼事的心理模型是它加載的所有數據,然後扔出去,我不想要的列。我顯然更喜歡它甚至沒有閱讀這些專欄,從我所瞭解的木地板看來,這似乎是可能的。

因此,有兩個問題:

  1. 是我的心智模式錯了嗎?還是火花編譯器足夠聰明,只能讀取上例中的a,b和c列?
  2. 如何強制sqc.parquetFile()更有效地讀取數據?
+0

我覺得你的機會來獲得只讀需要的列會更高,如果你'map' _before_'filter' – sds

回答

0

Spark總是以懶惰的方式使用本機scala功能來做事。 scala代碼已經被編譯,它使運行時變得聰明,我的意思是懶惰的決定。使用鑲木地板時,應只讀取代碼引用的必要數據。當然,這取決於特定木地板文件的結構。關鍵是它會利用列式格式。我對Python不夠了解,但它應該能夠做同樣的事情。也許檢查pyspark Row類是否使用某種懶惰的魔法。一種快速驗證的方法是進行受控實驗,編寫另一個引用更多字段的rdd操作,但不輸出它們。然後,您可以比較兩次操作之間的掛鐘時間差異。根據底層parquet文件的一些相關細節,您可能看不到延遲加載的差異。

相關問題