开发者社区> 问答> 正文

在确定排名时考虑具有相同值的项目

在spark中,我想计算值是如何小于或等于其他值。我试图通过排名实现这一目标,但排名产生, [1,2,2,2,3,4] -> [1,2,2,2,5,6] 而我想要的是 [1,2,2,2,3,4] -> [1,4,4,4,5,6]

我可以通过排名,按等级分组然后根据组中的项目数量修改排名值来实现此目的。但这有点效率低下。有更好的方法吗?

编辑:添加了我想要完成的最小示例

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.rank
import org.apache.spark.sql.expressions.Window

object Question extends App {
val spark = SparkSession.builder.appName("Question").master("local[*]").getOrCreate()

import spark.implicits._

val win = Window.orderBy($"nums".asc)

Seq(1, 2, 2, 2, 3, 4)

.toDF("nums")
.select($"nums", rank.over(win).alias("rank"))
.as[(Int, Int)]
.groupByKey(_._2)
.mapGroups((rank, nums) => (rank, nums.toList.map(_._1)))
.map(x => (x._1 + x._2.length - 1, x._2))
.flatMap(x => x._2.map(num => (num, x._1)))
.toDF("nums", "rank")
.show(false)

}
输出:

nums rank
1 1
2 4
2 4
2 4
3 5
4 6

展开
收起
社区小助手 2018-12-05 14:53:20 1501 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    使用窗口功能

    scala> val df = Seq(1, 2, 2, 2, 3, 4).toDF("nums")
    df: org.apache.spark.sql.DataFrame = [nums: int]

    scala> df.createOrReplaceTempView("tbl")

    scala> spark.sql(" with tab1(select nums, rank() over(order by nums) rk, count(*) over(partition by nums) cn from tbl) select nums, rk+cn-1 as rk2 from tab1 ").show(false)

    18/11/28 02:20:55 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
    nums rk2
    1 1
    2 4
    2 4
    2 4
    3 5
    4 6

    scala>
    请注意,df不会在任何列上进行分区,因此spark会将所有数据移动到单个分区。

    EDIT1:

    scala> spark.sql(" select nums, rank() over(order by nums) + count(*) over(partition by nums) -1 as rk2 from tbl ").show

    18/11/28 23:20:09 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
    nums rk2
    1 1
    2 4
    2 4
    2 4
    3 5
    4 6

    scala>

    2019-07-17 23:18:23
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载