Spark 3.x+的Map按键排序Scala代码适配Spark 2.x运行需求
Spark 2.x 适配版:DataFrame Map按键排序实现
Spark 3.x中用到的map_from_entries、array_sort是3.x版本新增的内置函数,Spark 2.x并不支持,因此我们需要通过自定义UDF来实现Map按键排序的逻辑。
适配后的完整代码
import spark.implicits._ import org.apache.spark.sql.functions._ // 定义按键升序排序的UDF val sortMapByKey = udf((inputMap: Map[String, Int]) => { inputMap.toSeq.sortBy(_._1).toMap }) // 若需要降序排序,可使用这个UDF // val sortMapByKeyDesc = udf((inputMap: Map[String, Int]) => { // inputMap.toSeq.sortBy(_._1).reverse.toMap // }) // 创建测试DataFrame val testDF = Seq( ("cat", Map("black"->3, "brown"->5, "white"->1)), ("dog", Map("cream"->6, "black"->5, "white"->2)) ).toDF("animal", "ageMap") testDF.show(false) // 生成按键排序后的Map列 val testDF1 = testDF.withColumn("keySort", sortMapByKey(col("ageMap"))) testDF1.show(false)
代码说明
- 自定义UDF借助Scala原生集合操作实现排序:先将Map转为键值对序列,按第一个元素(即key)排序,再转回Map结构。
- 若需要实现原代码中的
reverseMap功能(交换Map的键值),Spark 2.x也需用UDF实现:
val reverseMap = udf((inputMap: Map[String, Int]) => { inputMap.map { case (k, v) => (v.toString, k) } })
内容的提问来源于stack exchange,提问作者Busy Girl
相关产品推荐
相关产品推荐

