我正在开发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)