我正在使用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
此处无需使用,只需与map变量一起迭代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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句