2016-06-10 96 views
1

在這段代碼從Spark Programming Guide懶評價SparkSQL

# The result of loading a parquet file is also a DataFrame. 
parquetFile = sqlContext.read.parquet("people.parquet") 

# Parquet files can also be registered as tables and then used in SQL statements. 
parquetFile.registerTempTable("parquetFile"); 
teenagers = sqlContext.sql("SELECT name FROM parquetFile WHERE age >= 13 AND age <= 19") 
teenagers.collect() 

究竟發生在Java堆(如何星火存儲管理)時,每行執行?

我有這些問題的具體

  1. 是sqlContext.read.parquet懶惰?它是否會導致整個鑲木地板文件被加載到內存中?
  2. 當執行collect操作時,對於要應用的SQL查詢,

    a。是整個實木複合地板首先作爲RDD存儲並且然後被處理或者

    b。是首先處理的鑲木地板文件,只選擇name列,然後將其存儲爲RDD,然後根據Spark的age條件進行過濾?

回答

-1

sqlContext.read.parquet是懶嗎?

是的,默認情況下spark中的所有轉換都是惰性的。

當執行收集動作,對於要施加

一個SQL查詢。是整個實木複合地板首先作爲RDD存儲並且然後被處理或者

b。是先處理parquet文件以僅選擇名稱列,然後將其存儲爲RDD,然後根據Spark的年齡條件進行過濾?

在每個動作上,火花會產生新的RDD。 Parquet也是一種柱狀格式,Parquet閱讀器使用下推式過濾器來進一步減少磁盤IO。 下推濾波器允許在將數據讀入Spark之前做出早期數據選擇決策。 所以只有部分文件會被加載到內存中。

+1

'DataFrameReader'操作通常不是懶惰的。他們需要元數據或數據訪問取決於來源。 – zero323

+0

請提供參考您的評論 –

+3

該參考文獻在DataFrame的代碼源@atulgupta – eliasah