首页 > 解决方案 > 如何将 Scala 函数应用于两个不同的列数据框 Scala

问题描述

我目前正在用 Scala 编写脚本,为此,我预先编写了一个如下所示的函数:

def reducer_scala(node: (Int, List[Int])): (List[(Int, Int)], Int) = {
var counter = 0
var minimum = node._1
var value_List = List.empty[Int]
var joined = List.empty[(Int, Int)]

for(value <- node._2){
    if(value < minimum){
      minimum = value
    }
    value_List :+= value
  }

if(minimum<node._1){
    joined = joined :+ (node._1, minimum)
    for(value <- value_List){
  
      if(minimum != value){
        counter = counter + 1
        joined = joined :+ (value, minimum)
      }
    }
  }
  return (joined, counter)
}

如您所见,它将一个 Int 和一个 List[Int] 的元组作为输入。

我现在想将它应用于我的 Dataframe 中的两列,如下所示:

  _1,      collect_list(_2)

   0|             [1]|
|  1|       [2, 3, 0]|
|  3|          [4, 1]|
|  5|             [6]|
|  6|          [7, 5]|
|  2|             [1]|
|  4|             [3]|
|   7|             [6]

如您所见,第一列是 Int,第二列是 List。

我想知道:-如何在同一个元组中重新组合两列的每个元素-如何将我的 reducer_scala 函数应用于每个元素(元组(element_column_1,element_column_2))

此致

标签: arraysscalafunctiondataframetuples

解决方案


select()函数使您可以将 udf 应用于数据框的每一行,选择您想要的列col("colname") 您只需稍微调整一下您的函数,以便它接受两个单独的参数而不是一个元组。

确保您的函数已注册为 udf,例如:

val reducer = udf {(x: Int, y: List[Int]) => reducer_scala(x, y)}

然后用df = df.select(reducer(col("colname1"), col("colname2")))

希望这可以帮助!


推荐阅读