2016-07-25 8 views
8

Potrzebuję funkcji okna, która partycje przez niektóre klucze (= nazwy kolumn), zamówienia przez inną nazwę kolumny i zwraca wiersze z najwyższym x rangi.Jak używać polecenia orderby() w porządku malejącym w funkcjach okna Spark?

Działa to dobrze dla porządku rosnącym:

def getTopX(df: DataFrame, top_x: String, top_key: String, top_value:String): DataFrame ={ 
    val top_keys: List[String] = top_key.split(", ").map(_.trim).toList 
    val w = Window.partitionBy(top_keys(1),top_keys.drop(1):_*) 
     .orderBy(top_value) 
    val rankCondition = "rn < "+top_x.toString 
    val dfTop = df.withColumn("rn",row_number().over(w)) 
     .where(rankCondition).drop("rn") 
    return dfTop 
} 

Ale gdy próbuję go zmienić na orderBy(desc(top_value))orderBy(top_value.desc) lub w wierszu 4, pojawia się błąd składni. Jaka jest prawidłowa składnia?

+0

Co jest komunikat o błędzie dostajesz? –

Odpowiedz

16

Dostępne są dwie wersje orderBy, jedna działająca z ciągami i jedna z obiektami Column (API). Twój kod używa pierwszej wersji, która nie pozwala na zmianę kolejności sortowania. Musisz przejść do wersji kolumny, a następnie wywołać metodę desc, np. myCol.desc.

Teraz wchodzimy w obszar projektowania interfejsu API. Zaletą przekazywania parametrów jest to, że masz dużo większą elastyczność, np. Możesz używać wyrażeń itp. Jeśli chcesz zachować API, które przyjmuje ciąg znaków, w przeciwieństwie do Column, musisz przekonwertować ciąg znaków na kolumna. Istnieje wiele sposobów na zrobienie tego i najłatwiej jest użyć org.apache.spark.sql.functions.col(myColName).

Kładzenie to wszystko razem, otrzymujemy

.orderBy(org.apache.spark.sql.functions.col(top_value).desc) 
+0

.orderBy (org.apache.spark.sql.functions.col (top_value) .desc()) – kecso

+0

Nawiasy są niepotrzebne w Scali. – Sim

+0

ohh ... na pewno nie sprawdziłem, czy kod w pytaniu jest scala, i ma tag scala :) Przepraszamy za to – kecso