根据另一列

时间:2017-03-01 14:48:39

标签: scala apache-spark dataframe apache-spark-sql

我有以下问题:

  • 包含DataFrame col1的{​​{1}}字符串ABC
  • 第二个col2Integer
  • 其他三列col3col4col5(这些列也命名为ABC)。

因此,

 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

1 个答案:

答案 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|
+----+----+----+----+----+