如何将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函数应用于每个元素(Tuple(element_column_1,element_cocolumn_2((

致以最诚挚的问候

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")))调用

希望这能有所帮助!

最新更新