【问题标题】:Spark dataframe: transform map with StructType value to a sorted listSpark 数据框:将具有 StructType 值的映射转换为排序列表
【发布时间】:2017-04-11 22:57:05
【问题描述】:

我有一个具有以下架构的数据框:

root
 |-- id: string (nullable = true)
 |-- scoreMap: map (nullable = true)
 |    |-- key: string
 |    |-- value: struct (valueContainsNull = true)
 |    |    |-- scores: struct (nullable = true)
 |    |    |    |-- SCORE1: double (nullable = true)
 |    |    |    |-- SCORE2: double (nullable = true)
 |    |    |    |-- SCORE3: double (nullable = true)
 |    |    |-- combinedScore: double (nullable = true)

样本数据:

id   scoreMap
id1   Map(key1 -> [[1.0, 3.2, 2.22], 2.42],   key2 -> [[3.0, 3.2, 1.2], 4.42])
id2   Map(key3 -> [[1.0, 3.2, 2.22], 3.1],   key3 -> [[3.0, 3.2, 1.2], 2.42])

我想要 1)。将scoreMap 列转换为列表,2)。按combinedScore 对列表进行排序(描述),3)。将排序列表中每个元素的索引添加到元素中。对于给定的示例,结果应该是:

id   scoreList
id1   List([key2, [3.0, 3.2, 1.2], 4.42, 0], [key1,[1.0, 3.2, 2.22], 2.42, 1]])
id2   List([key3, [1.0, 3.2, 2.22], 3.1, 0],   [key3, [3.0, 3.2, 1.2], 2.42, 1])

我怎样才能做到这一点?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

    你可以这样做:

    import sqlContext.implicits._
    import org.apache.spark.sql.functions.udf
    val mapToSortedList: Map[String,Scores] => List[(String,Scores)] = _.toList.sortBy(scores=>scores.combinedScore)
    val mapToListUDF = udf(mapToSortedList)
    val newDF = dF.withColumn("scoreMap",mapToListUDF('scoreMap))
    

    我的回答不包括添加的索引部分。不知道如何在不编写复杂代码的情况下实现它(使用自定义排序创建新的 List 类型,为每个元素添加排序索引)

    我希望这至少作为一个起点有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-09
      • 2019-08-25
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2020-01-18
      相关资源
      最近更新 更多