使用具有键 -> 列名的映射在数据帧上 Spark 选择列



我正在开发Apache spark 2.3.0 cloudera4,根据映射中的值选择特定列时遇到问题。

我有这些输入,一个数据帧:

+---+---+---+...+
| id| c1| c2| cN|
+---+---+---+...+
|  a|1.0|2.0|...|
|  a|3.0|4.0|...|
|  b|5.0|6.0|...|
|  c|7.0|8.0|...|
+---+---+---+---+

每个"c"列都是双重类型。

还有一张地图:

Map("a" -> "c1", "b" -> "c2", "c" -> "c1")

我需要这个输出:

+---+---+
| id|  c|
+---+---+
|  a|1.0|
|  a|3.0|
|  b|6.0|
|  c|7.0|
+---+---+

从性能角度来看,获得输出的最佳方式是哪一种?

现在,我正在对map键进行迭代,使用where子句选择值col和id列,并与前一步进行并集(第一步是使用空数据帧进行的(。我认为这种操作会影响我的流程性能。

这里不需要使用union,与coalesce一起迭代映射变量就足够了。这将根据id列和字典中的值选择正确的列:

import spark.implicits._
val m = Map("a" -> "c1", "b" -> "c2", "c" -> "c1")
val c = coalesce(m.map{case (k,v) => when($"id" === k, col(v)).otherwise(lit(null))}.toSeq: _*)
df.select($"id", c)

最新更新