dataframe - 使用 Scala 根据 Spark Dataframe 中另一列的值选择一列

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

我有一个包含 5 列的数据框 - sourceId , score_1 , score_3 , score_4score_7sourceId 的值列可以是[1, 3, 4, 7] 。我想将其转换为另一个具有列 sourceId 的数据框和score ,其中分数取决于 sourceId 的值专栏。

<表类=“s-表”> <标题> 源ID score_1 score_3 score_4 score_7 <正文> 1 0.3 0.7 0.45 0.21 4 0.15 0.66 0.73 0.47 7 0.34 0.41 0.78 0.16 3 0.77 0.1 0.93 0.67

所以如果 sourceId = 1 ,我们选择值score_1对于该记录,如果 sourceId = 3 ,我们选择值score_3 ,等等...

结果是

<表类=“s-表”> <标题> 源ID 得分 <正文> 1 0.3 4 0.73 7 0.16 3 0.1

在 Spark 中执行此操作的最佳方法是什么?

最佳答案

id 列值上链接多个 when 表达式:

val ids = Seq(1, 3, 4, 7)

val scoreCol = ids.foldLeft(lit(null)) { case (acc, id) =>
  when(col("sourceId")===id, col(s"score_$id")).otherwise(acc)
}

val df2 = df.withColumn("score", scoreCol)

或者从 score_* 列构建 map 表达式并使用它来获取 score 值:

val scoreMap = map(
  df.columns
    .filter(_.startsWith("score_"))
    .flatMap(c => Seq(lit(c.split("_")(1)), col(c))): _*
)

val df2 = df.withColumn("score", scoreMap(col("sourceId")))

关于dataframe - 使用 Scala 根据 Spark Dataframe 中另一列的值选择一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70966398/

相关文章:

python - 如何求和引用其他数据框的总数

python - Pandas 中的递归操作

scala - 使用通配符打开多个 csv 文件 Spark Scala

apache-spark - 为什么第一次和第二次执行spark sql查询的执行时间不同?

apache-spark - AWS Glue - 无法设置 spark.yarn.executor.memoryOverhead

java - 使用 Spark 驱动程序中的 Java native readObject 进行反序列化时出现 ClassCastException

python - 检查 pandas DataFrame 系列中的值是否存在于 Excel 工作表中

r - 在不修改原始顺序的情况下对事件进行计数

Scala 下划线 - 错误 : missing parameter type for expanded function

scala - 单位和()单位有什么区别