2017-06-04 79 views
-1

我有一個數據幀DF優先權規則過濾掉來自星火據幀數據,一些樣本記錄被提及如下:利用星火

**customers** **product** **val_id** 
    1    A   1 
    2    C   r 
    3    B   X  
    4    D   X 
    5    E   1 
    6    F   9 

我的,我要申請這個數據的規則有些n個,一些樣品規則是:

名稱:規則1,ID:1

filter out customers who have product A and B, rule priority is 1 

名稱:規則2,ID:2

filter out customers who have product A, B,C and F, rule priority is 3 

名稱:規則3,ID:3

filter out customers who have product C and E, rule priority is 2 

要求是,創建一個新的數據幀,並過濾掉從這些規則通過這些客戶,也提到從中排除他們通過,從優先1規則通過的客戶,不應該由優先級較低的規則處理,並且從優先級2規則通過的客戶不應該由低優先級規則處理等等。

所以我最後的數據幀應該是:

**customers** **product** **val_id** **rule_name** **rule_id** 
    1    A   1    Rule1   1 
    2    C   r    Rule3   3 
    3    B   X    Rule1   1 
    5    E   1    Rule3   3 
    6    F   9    Rule2   2 

有人可以幫我解決這個問題,利用星火斯卡拉。任何幫助將不勝感激。

+0

爲什麼在您的示例中Rule1分配給ID爲1的客戶? – AKSW

回答

0

嘗試這樣的事情:

val rule_name = when(col("product").isin("A","B"), "ABC").otherwise(when(col("product").isin("A","B","D"), "DEF").otherwise("")) 
val rule_id = when(col("product").isin("A","B"), "123").otherwise(when(col("product").isin("A","B","D"), "456").otherwise("")) 
val df1 = df_customers.withColumn("rule_name" , rule_name).withColumn("rule_id" , rule_id) 
df1.show() 

這是一個例子,可能不是一個確切的解決方案,但你將能夠解決您的問題。

1

您可以通過定義爲

def rule_name = udf((product : String) => { 
    if(Seq("A", "B").contains(product)) "Rule1" 
    else if(Seq("A", "B", "C", "F").contains(product)) "Rule3" 
    else if(Seq("C", "E").contains(product)) "Rule2" 
    else "" 
}) 

def rule_id = udf((product : String) => { 
    if(Seq("A", "B").contains(product)) "1" 
    else if(Seq("A", "B", "C", "F").contains(product)) "3" 
    else if(Seq("C", "E").contains(product)) "2" 
    else "" 
}) 

rule_nameudf功能和rule_id列解決它,然後用空規則

調用使用 withColumn功能這些 udf功能

val ruledDF = dataframe.withColumn("rule_name" , rule_name(col("product"))) 
    .withColumn("rule_id" , rule_id(col("product"))) 

最後filterrows

ruledDF.filter(!(ruledDF("rule_name") === "")) 

這應該有你的要求履行。

+0

此解決方案表示客戶C通過Rule2,但它應該已通過規則3,因爲規則3的優先級很高 –

+0

在udf函數中切換優先級應解決問題。我已經更新了我的答案。請檢查並讓我知道 –