2017-06-16 4 views
0

Ich habe einen Datenframe in Spark und ich habe einige Filter auf diesen Datenrahmen angewendet. Basierend auf den Datensätzen, die diese Filter durchlaufen haben, habe ich eine neue Spalte im Dataframe hinzugefügt. Siehe den folgenden Code:Vereinfachen mit Spalte in Spark

val rule_name = when(col("product_name").isin("N") && col("territory").isin("Metro","GA"), "rule1").otherwise(when(col("product_name").isin("XGE") && col("territory").isin("14721"), "rule2").otherwise("")) 
val df_final = df_join.withColumn("rule_name" , rule_name) 

Zum besseren Sichtbarkeit Zweck, ich mag in mehreren Zeilen Code unten brechen:

val rule_name = when(col("product_name").isin("N") && col("territory").isin("Metro","GA"), "rule1").otherwise(when(col("product_name").isin("XGE") && col("territory").isin("14721"), "rule2").otherwise("")) 

Gibt es eine Möglichkeit, dies in SCALA und pyspark in Funken zu erreichen?

Antwort

0

Sie haben bereits eine bessere Lösung. Wenn Sie eine bessere Lesbarkeit wünschen, können Sie die udf-Funktion verwenden. Die udf-Funktion würde jedoch erfordern, dass Spalten serialisiert und deserialisiert werden. So können Sie UDF-Funktion als

def rule_name = udf((product_name: String, territory: String) => { 
    val rule1ProductName = Array("N") 
    val rule2ProductName = Array("XGE") 
    val rule1Territory = Array("Metro", "GA") 
    val rule2Territory = Array("14721") 

    if(rule1ProductName.contains(product_name) && rule1Territory.contains(territory)) { 
    "rule1" 
    } 
    if(rule2ProductName.contains(product_name) && rule2Territory.contains(territory)) { 
    "rule2" 
    } 
    else "" 
}) 

verwenden Sie die UDF-Funktion als

nennen
val df_final = df_join.withColumn("rule_name" , rule_name($"product_name", $"territory")) 
0

Lösung Ihnen zur Verfügung gestellten ist optimal für diese:

val rule_name = when(col("product_name").isin("N") && col("territory").isin("Metro","GA"), "rule1").otherwise(when(col("product_name").isin("XGE") && col("territory").isin("14721"), "rule2").otherwise(""))