我有以下问题:
DataFrame
col1
的{{1}}字符串A
,B
或C
。 col2
,Integer
。 col3
,col4
和col5
(这些列也命名为A
,B
和C
)。 因此,
col1 - col2 - A (col3) - B (col4) - C (col5)
|--------------------------------------------
A 6
B 5
C 6
应该获得
col1 - col2 - A (col3) - B (col4) - C (col5)
|--------------------------------------------
A 6 6
B 5 5
C 6 6
现在我想浏览每一行,并根据col2
中的条目将col1
中的整数分配给A,B或C列。
我如何实现这一目标?
df.withColumn()
我无法使用(或者至少我不知道为什么),val df2 = df.map(x => x )
同样适用。
期待您的帮助和提前感谢!
Best,Ken
答案 0 :(得分:2)
在键列和目标列之间创建映射:
val mapping = Seq(("A", "col3"), ("B", "col4"), ("C", "col5"))
用它来生成列序列:
import org.apache.spark.sql.functions.when
val exprs = mapping.map { case (key, target) =>
when($"col1" === key, $"col2").alias(target) }
预装星标并选择:
val df = Seq(("A", 6), ("B", 5), ("C", 6)).toDF("col1", "col2")
df.select($"*" +: exprs: _*)
结果是:
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
| A| 6| 6|null|null|
| B| 5|null| 5|null|
| C| 6|null|null| 6|
+----+----+----+----+----+