Apache spark 使用键为->;的映射在数据帧上触发选择列;列名

Apache spark 使用键为->;的映射在数据帧上触发选择列;列名,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在使用ApacheSpark2.3.0ClouderA4,根据映射中的值选择特定列时遇到问题 我有这些输入,一个数据帧: +---+---+---+...+ | 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", "

我正在使用ApacheSpark2.3.0ClouderA4,根据映射中的值选择特定列时遇到问题

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

+---+---+---+...+
| 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子句选择value col和id列,并与前一步进行联合(第一步使用空数据帧)。我认为这类操作正在影响我的流程性能。

这里应该没有必要使用
union
,将map变量与
coalesce
一起迭代就足够了。这将根据
id
列和字典中的值选择正确的列:

导入spark.implicits_
val m=Map(“a”->“c1”,“b”->“c2”,“c”->“c1”)
val c=coalesce(m.map{case(k,v)=>when($“id”==k,col(v))。否则(lit(null))}.toSeq:*)
df.选择($“id”,c)

太棒了!它所需的时间减少了50%process@la.leiva:很乐意帮忙:)