Apache spark 根据其他两列的最小值添加新列

Apache spark 根据其他两列的最小值添加新列,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个数据框,如下所示 id id1 seq_nbr id2 orig_id1 orig_id2 1 740 2 217 740 217 1 740 3 216 740 216 1 740 4 216 740 216 1 740 5 217 740 217 1 367 1 217

我有一个数据框,如下所示

id  id1 seq_nbr     id2 orig_id1  orig_id2  
1   740     2       217     740     217         
1   740     3       216     740     216
1   740     4       216     740     216
1   740     5       217     740     217
1   367     1       217     740     217
我需要在orig_id1和orig_id2的基础上添加名为orig_seq_nbr的新列。预期产量为

id  id1 seq_nbr     id2 orig_id1  orig_id2 orig_seq_nbr
1   740     3       216     740     216         3
1   740     4       216     740     216         3
1   740     5       217     740     217         2
1   367     1       217     740     217         2
1   740     2       217     740     217         2
前两行有3,因为orig_id1、orig_id2有740216,并且基于id1、id2列(740216)的seq_nbr的最小值为3。 最后三行有2,因为orig_id1、orig_id2有740217,并且基于id1、id2列(740217)的seq_nbr的最小值为2

我试图根据orig_id1和orig_id2找到min,但得到的结果如下

val win = Window.partitionBy("orig_id1", "orig_id2")
df1.withColumn("orig_seq_nbr",min(col("seq_nbr")).over(win)).show()
在最后三行中,我应该更改什么以将原始序号设为2?

尝试这种方法-

1.加载测试数据
val数据=
"""
|id | id1 |序号编号| id2 |原id1 |原id2
|1  | 740 |     2     |  217 |    740  |   217
|1  | 740 |     3     |  216 |    740  |   216
|1  | 740 |     4     |  216 |    740  |   216
|1  | 740 |     5     |  217 |    740  |   217
|1  | 367 |     1     |  217 |    740  |   217
“.stripMargin”
val stringDS1=data.split(System.lineSeparator())
.map(\\\\\).map(\.replaceAll(“^[\t]+\\t]+$”,“).mkString(“,”)
.toSeq.toDS()
val df1=spark.read
.期权(“sep”、“、”)
.选项(“推断模式”、“真”)
.选项(“标题”、“正确”)
.选项(“空值”、“空值”)
.csv(stringDS1)
df1.显示(错误)
df1.printSchema()
/**
* +---+---+-------+---+--------+--------+
*| id | id1 |序号编号| id2 |原id1 |原id2|
* +---+---+-------+---+--------+--------+
* |1  |740|2      |217|740     |217     |
* |1  |740|3      |216|740     |216     |
* |1  |740|4      |216|740     |216     |
* |1  |740|5      |217|740     |217     |
* |1  |367|1      |217|740     |217     |
* +---+---+-------+---+--------+--------+
*
*根
*|--id:integer(nullable=true)
*|--id1:整数(可空=真)
*|--seq_nbr:integer(nullable=true)
*|--id2:整数(可空=真)
*|--orig_id1:整数(nullable=true)
*|--orig_id2:整数(nullable=true)
*/
2.使用DSL
val-win=Window.partitionBy(“orig_-id1”、“orig_-id2”)
df1.带列(“原始序号”,
最小值(当($“源代码id1”===$“id1”&&$“源代码id2”==$“id2”,$“序列编号”)。否则(空)
.超过(获胜)
).show()
/**
* +---+---+-------+---+--------+--------+------------+
*| id | id1 |序号编号| id2 |原id |原id1 |原id2 |原序号编号|
* +---+---+-------+---+--------+--------+------------+
* |  1|740|      3|216|     740|     216|           3|
* |  1|740|      4|216|     740|     216|           3|
* |  1|740|      2|217|     740|     217|           2|
* |  1|740|      5|217|     740|     217|           2|
* |  1|367|      1|217|     740|     217|           2|
* +---+---+-------+---+--------+--------+------------+
*/
3.使用SQL表达式
df1.withColumn(“orig_seq_nbr”,
expr(“最小值(原值id1=id1,原值id2=id2,则序列号否则为空端)”+
“超过(按源id1、源id2划分)”
).show()
/**
* +---+---+-------+---+--------+--------+------------+
*| id | id1 |序号编号| id2 |原id |原id1 |原id2 |原序号编号|
* +---+---+-------+---+--------+--------+------------+
* |  1|740|      3|216|     740|     216|           3|
* |  1|740|      4|216|     740|     216|           3|
* |  1|740|      2|217|     740|     217|           2|
* |  1|740|      5|217|     740|     217|           2|
* |  1|367|      1|217|     740|     217|           2|
* +---+---+-------+---+--------+--------+------------+
*/
id  id1 seq_nbr     id2 orig_id1  orig_id2 orig_seq_nbr
1   740     3       216     740     216         3
1   740     4       216     740     216         3
1   740     5       217     740     217         1
1   367     1       217     740     217         1
1   740     2       217     740     217         1