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