首页 > 解决方案 > Apache Spark根据列的不同值计算列值

问题描述

我正在处理下表,我想根据其他 2 个列的不同值计算一个新列(结果)。

| id1  | id2 | outcome
|  1   |  1  |  1
|  1   |  1  |  1
|  1   |  3  |  2
|  2   |  5  |  1 
|  3   |  1  |  1  
|  3   |  2  |  2
|  3   |  3  |  3

结果应根据 和 的组合值从 1 开始以递增顺序id1开始id2。任何提示如何在 Scala 中实现这一点。row_number在这种情况下,这里似乎没有用。

这里的逻辑是,对于每个唯一的值,id1我们将开始用 min( id2) 对结果进行编号,对应id1的值被分配为 1。

标签: scalaapache-spark

解决方案


使用Window函数来俱乐部(partition)他们first id,然后order每个人都partition基于second id

现在您只需要dense_rank在每个Window分区上分配一个等级 ( )。

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

df
.withColumn("outcome", dense_rank().over(Window.partitionBy("id1").orderBy("id2")))


推荐阅读