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