【问题标题】:How to use orderby() with descending order in Spark window functions?如何在 Spark 窗口函数中以降序使用 orderby()?
【发布时间】:2016-11-29 02:22:17
【问题描述】:

我需要一个窗口函数,该函数按某些键(=列名)进行分区,按另一个列名排序并返回具有最高 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) 时,出现语法错误。这里的正确语法是什么?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

    orderBy 有两种版本,一种适用于字符串,另一种适用于 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)
    

    【讨论】:

    • 数据集中的 orderBy 和 sort 是否相同?因为两者都适合我。 org.apache.spark.sql.functions.{col}bhData.sort(col("count").desc)
    • @vijayraj34 这个问题是关于窗口函数的,WindowSpec 中没有 sortsortBy。因此,我假设您在询问数据集级别的排序。如果您阅读 Dataset 的 Spark 代码库,您将看到 def orderBy(sortExprs: Column*): Dataset[T] = sort(sortExprs : _*)。换句话说,sort 在数据集级别等同于orderBy
    • 我在 desc 后面没有使用括号时出现错误,不知道为什么。添加后,它可以按我的意愿工作,留下.orderBy(f.col('col_name_1'),f.col('date'), f.col('col_name_2').desc())
    • @Anne 你不应该在 Scala 中使用括号,这是问题中标记的语言,但你必须在 Python 中使用它们,你似乎在使用单引号围绕你的琴弦。
    • @Sim 我的错,对不起!我正在涉足 PySpark,这当然与这个线程无关。
    【解决方案2】:

    例如,如果我们需要在 Window 函数中按名为 Date 的列按降序排序,请在列名称前使用 $ 符号,这将使我们能够使用 asc 或 @987654324 @ 语法。

    Window.orderBy($"Date".desc)
    

    用双引号指定列名后,给出.desc,它将按降序排序。

    【讨论】:

      【解决方案3】:

      栏目

      col = new Column("ts")
      col = col.desc()
      WindowSpec w = Window.partitionBy("col1", "col2").orderBy(col)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 2016-12-16
        • 2021-02-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        相关资源
        最近更新 更多