2016-06-21 65 views
5

使用從Hive導入的Spark數據框,有時候最終會得到幾個不需要的列。假設我不想與在PySpark數據框中選擇特定列以提高性能

df = SqlContext.sql('select cols from mytable') 

對其進行過濾和我導入整個表

df = SqlContext.table(mytable) 

做了select和隨後cache提高性能/減少內存使用情況,像

df = df.select('col_1', 'col_2', 'col_3') 
df.cache() 
df.count() 

還是隻是浪費時間?我會做很多操作和數據操作上df,像avgwithColumn

+0

Cache有很多幫助,所以它會提升性能。 –

+0

但是事先做一個選擇是否值得? – Ivan

+0

是的,如果您在以下步驟中不需要其他列 - 那麼您只需要緩存中的列 – MaxU

回答

1

IMO是有意義事先進行篩選:

df = SqlContext.sql('select col_1, col_2, col_3 from mytable') 

這樣你就不會浪費資源......

如果你不能做這種方式,那麼你就可以做到這一點,你做到了......

0

這當然是一個很好的做法,但它是相當不太可能導致性能提升,除非你嘗試傳遞數據thr呃Python RDD或者做類似的事情。如果不需要某些列來計算輸出優化器應自動推斷投影並儘早在執行計劃中推送這些投影。

另外值得注意的是,在df.cache()之後使用df.count()在大多數時間(如果不是總是)是無用的。一般來說count由優化改寫爲

SELECT SUM(1) FROM table 

那麼,什麼是一般從源頭上要求是:

SELECT 1 FROM table 

長話短說有在這裏緩存沒什麼用處。

+0

再次感謝@ zero323!我正在考慮更多關於在緩存執行緩存操作之後執行計數的操作,並檢查一些副本的數字。我注意到有時候執行'select'會導致緩存之前的性能*變差。 – Ivan

+0

那麼,關於Spark SQL中緩存的推理是相對困難的,像'cache' /'count'這樣的技巧並不是最好的想法。你可以看到一些與Spark緩存無關的性能提升,例如當數據被映射到內存映射時,但恕我直言它更像是一種儀式,然後是其他任何東西。 – zero323