2017-08-14 60 views
1

如果我試圖緩存一個巨大的DataFrame(例如:100GB表),並且當我對緩存的DataFrame執行查詢時,它會執行全表掃描嗎?火花將如何索引數據。星火文件說:緩存查詢性能Spark

星火SQL可以通過 使用緩存在內存中柱狀格式表調用spark.catalog.cacheTable(「表名」)或dataFrame.cache()。 然後,Spark SQL將只掃描所需的列,並自動調整壓縮以最大限度地減少內存使用量和GC壓力。您可以通過調用spark.catalog.uncacheTable(「tableName」) 從 內存中刪除該表。

http://spark.apache.org/docs/latest/sql-programming-guide.html#caching-data-in-memory

我沒有完全理解上述說法,這將是非常有益的,如果有人詳細地介紹了以下聲明或解釋它是如何在大數據幀緩存優化查詢

「然後Spark SQL將只掃描所需列,並將自動調整

調整壓縮「

+0

你能提供.explain()方法的查詢計劃嗎? – addmeaning

回答

0

,當我執行的緩存DataFrame查詢將對其執行全表掃描?火花將如何索引數據。

雖然可以進行一些小的優化,但是Spark根本沒有索引數據。因此,一般情況下,您應該假設Spark將執行完整的數據掃描。

但它可以應用早期預測。因此,如果查詢只使用列的子集,則Spark只能訪問這些,這是必需的。

柱狀商店是良好候選壓縮和火花支持許多壓縮方案(RunLengthEncodingDictEncodingBooleanBitSetIntDeltaLongDelta)的。根據列的類型和計算的統計信息,Spark可以自動選擇合適的壓縮格式或跳過壓縮。

與列式存儲一起使用的一般壓縮方案允許對壓縮數據和某些(如RLE)的查詢進行高效選擇。同時,您可以增加可存儲在內存中的數據量,並且無需從磁盤獲取數據即可訪問。