2017-01-14 69 views
10

優化指標生成這是一個優化的問題,這是我現在的(工作)情況:星火,從DF

  • 星火使用火花jobserver在單機模式下運行;
  • 我有一個帶有〜3M行緩存的鑲木地板文件作爲表格;
  • 該表是來自電子商務網站的所有數據的綜合數據,每行代表一個用戶,但用戶可以有更多的行;

客戶端請求是執行SQL查詢,並且在一些表的網頁上顯示的結果,每一個表示一個度量與計數器,如:

年齡=> 18-20 :15個用戶,21-35:42級的用戶,......

國家=> USA:22用戶,GB:0個用戶,...

等。計算所有表格(連同一些關於用戶會話,根據活動,期間和年份生成的),目前約有200個指標。

在生產使用最後釋放系統(考慮DF從SQL查詢得到的數據幀):

df.rdd.aggregate(metricsMap) (

     (acc: MetricsMap, r:Row) => { 
     acc.analyzeRow(r) 
     acc 
     }, 

     (acc1: MetricsMap, acc2: MetricsMap) => { 
     acc1.merge(acc2) 
     acc1 
     } 
    ) 

MetricsMap是用於提取和從行聚合數據的對象。

該操作是非常CPU密集型,並在服務器上花費約20秒,以提取一個查詢的數據不帶參數(因此從地板文件中的所有數據)。

我決定使用聚合,因爲對於他們的統計分析,他們想要多個潛在客戶:一些指標應該用用戶密鑰來計算,另一個用戶名(用於網站......),另一個用產品密鑰。使用這種方法,我不得不通過結果循環只有一次,但我不知道這是否是更好的辦法...

這是更好的方法,也存在着一些其他的(快)方法來獲得同樣的結果?

至於有關計算指標事前,他們可以對數據集執行查詢不約束的問題,所以我不知道這是可能的或不...能不能請你給我一個例子嗎?

回答一些問題,在這種情況下,數據的

+3

你能否提供更多有關聚合的信息?基本上,有沒有原因讓你回到rdd而不是在dataframe/SQL級別工作? –

+0

您可以預先計算指標嗎? –

回答

0

一個路徑是明顯好於具有多個週期,在情況下,你要回答同一請求多個查詢。

可能更有效,雖然不能與火花核心互操作。

例如,如果你的DF架構如下:

root 
-- age 
-- country 

那麼你可以嘗試做以下僞基本查詢:

Select 
CASE WHEN (age BETWEEN 18 AND 22) THEN '18-22' 
    WHEN (age BETWEEN 22 AND 30) THEN '22-30' 
    ELSE 'Other' as age_group, 
country 
from metrics_df 

你也可以考慮使用UDF的年齡階層。 正如@ assaf-mendelson所提到的,更多信息會在這裏有用。