用 Spark Scala 中的另一个列值替换列字符串名称
Replace column string name with another column value in Spark Scala
我有以下数据框,其中有一列 sig
和 N
其他列。
sig
包含嵌入其中的 N
列数,如下所示。嵌入的列名称可以是数据框中存在的任何数字。
我想用其他列中的相应值更新 sig
列。
例如,
+---------------------------------------------------------------------+------------+------------------+-------------------+--------+
|sig |order_timing|po_manl_create_ind|mabd_arrival_status|cut_time|
+---------------------------------------------------------------------+------------+------------------+-------------------+--------+
|R1:BR1-order_timing:BR2-po_manl_create_ind:BR3-mabd_arrival_status:R1|14 |0 |late |23 |
|R1:BR1-order_timing:BR2-po_manl_create_ind:BR7-cut_time:R1 |14 |0 |on_time |10 |
预期输出
+---------------------------------------------------------------------+------------+-----
|sig |order_timing|po_manl_create_ind|mabd_arrival_status|cut_time|
+---------------------------------------------------------------------+------------+-----
|R1:BR1-14:BR2-0:BR3-late:R1|14 |0 |late |23 |
|R1:BR1-14:BR2-0:BR7-10:R1 |14 |0 |on_time |10 |
一种方法是使用可能出现在 sig
值中的列列表来链接多个 replace
表达式。
使用此示例 DF:
val df = Seq(
("R1:BR1-order_timing:BR2-po_manl_create_ind:BR3-mabd_arrival_status:R1", 14, 0, "late", 23),
("R1:BR1-order_timing:BR2-po_manl_create_ind:BR7-cut_time:R1", 14, 0, "on_time", 10),
).toDF("sig", "order_timing", "po_manl_create_ind", "mabd_arrival_status", "cut_time")
您可以像这样使用 foldLeft 生成替换表达式 replace_expr
:
val replace_expr = df.columns
.filter(_ != "sig")
.foldLeft("sig")((acc, c) => s"replace($acc, '$c', $c)")
df.withColumn("sig", expr(replace_expr)).show(false)
//+---------------------------+------------+------------------+-------------------+--------+
//|sig |order_timing|po_manl_create_ind|mabd_arrival_status|cut_time|
//+---------------------------+------------+------------------+-------------------+--------+
//|R1:BR1-14:BR2-0:BR3-late:R1|14 |0 |late |23 |
//|R1:BR1-14:BR2-0:BR7-10:R1 |14 |0 |on_time |10 |
//+---------------------------+------------+------------------+-------------------+--------+
我有以下数据框,其中有一列 sig
和 N
其他列。
sig
包含嵌入其中的 N
列数,如下所示。嵌入的列名称可以是数据框中存在的任何数字。
我想用其他列中的相应值更新 sig
列。
例如,
+---------------------------------------------------------------------+------------+------------------+-------------------+--------+
|sig |order_timing|po_manl_create_ind|mabd_arrival_status|cut_time|
+---------------------------------------------------------------------+------------+------------------+-------------------+--------+
|R1:BR1-order_timing:BR2-po_manl_create_ind:BR3-mabd_arrival_status:R1|14 |0 |late |23 |
|R1:BR1-order_timing:BR2-po_manl_create_ind:BR7-cut_time:R1 |14 |0 |on_time |10 |
预期输出
+---------------------------------------------------------------------+------------+-----
|sig |order_timing|po_manl_create_ind|mabd_arrival_status|cut_time|
+---------------------------------------------------------------------+------------+-----
|R1:BR1-14:BR2-0:BR3-late:R1|14 |0 |late |23 |
|R1:BR1-14:BR2-0:BR7-10:R1 |14 |0 |on_time |10 |
一种方法是使用可能出现在 sig
值中的列列表来链接多个 replace
表达式。
使用此示例 DF:
val df = Seq(
("R1:BR1-order_timing:BR2-po_manl_create_ind:BR3-mabd_arrival_status:R1", 14, 0, "late", 23),
("R1:BR1-order_timing:BR2-po_manl_create_ind:BR7-cut_time:R1", 14, 0, "on_time", 10),
).toDF("sig", "order_timing", "po_manl_create_ind", "mabd_arrival_status", "cut_time")
您可以像这样使用 foldLeft 生成替换表达式 replace_expr
:
val replace_expr = df.columns
.filter(_ != "sig")
.foldLeft("sig")((acc, c) => s"replace($acc, '$c', $c)")
df.withColumn("sig", expr(replace_expr)).show(false)
//+---------------------------+------------+------------------+-------------------+--------+
//|sig |order_timing|po_manl_create_ind|mabd_arrival_status|cut_time|
//+---------------------------+------------+------------------+-------------------+--------+
//|R1:BR1-14:BR2-0:BR3-late:R1|14 |0 |late |23 |
//|R1:BR1-14:BR2-0:BR7-10:R1 |14 |0 |on_time |10 |
//+---------------------------+------------+------------------+-------------------+--------+