web-dev-qa-db-ja.com

Sparkウィンドウ関数でorderby()を降順で使用するには?

いくつかのキー(=列名)で分割し、別の列名で並べ替え、上位xランクの行を返すウィンドウ関数が必要です。

これは昇順でうまく機能します:

_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
}
_

しかし、4行目でorderBy(desc(top_value))またはorderBy(top_value.desc)に変更しようとすると、構文エラーが発生します。ここで正しい構文は何ですか?

18
Malte

orderByには2つのバージョンがあり、1つは文字列で動作し、もう1つはColumnオブジェクトで動作します( [〜#〜] api [〜#〜] )。コードは最初のバージョンを使用しているため、並べ替え順序を変更できません。列バージョンに切り替えて、descメソッドを呼び出す必要があります(例:_myCol.desc_)。

次に、API設計の領域に入ります。 Columnパラメータを渡すことの利点は、式などを使用できるなど、柔軟性がはるかに高いことです。Columnではなく文字列を受け取るAPIを維持する場合は、文字列を列に変換する必要があります。これを行う方法はいくつかありますが、最も簡単な方法はorg.Apache.spark.sql.functions.col(myColName)を使用することです。

すべてをまとめると、

_.orderBy(org.Apache.spark.sql.functions.col(top_value).desc)
_
34
Sim

たとえば、Window関数でDateという列を降順で並べる必要がある場合、列名の前に$記号を使用すると、ascまたはdesc構文。

Window.orderBy($"Date".desc)

列名を二重引用符で指定した後、.descを指定すると、降順にソートされます。

1
Sarath Avanavu

列col = new Column( "ts");
col = col.desc();
WindowSpec w = Window.partitionBy( "col1"、 "col2")。orderBy(col);

0
Gaurang Popat