arrays - 如何将 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))
此致
解决方案
该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")))
希望这可以帮助!
推荐阅读
- python - 锯齿交易错误:“试图设置未经授权的地址”
- azure-active-directory - 应用 ID 显示在 JWT 令牌中,而不是应用 ID URI?
- reactjs - 如何在 Meteor 上使用 Github 创建帐户
- python - 处理 30 个元素后如何处理间隔(5 分钟)的大列表?
- yii2 - session_start():读取会话数据失败:Yii2中的redis(路径:tcp://127.0.0.1:6380)?
- javascript - javascript unshift pop 在一个循环中
- python - 如何为现成的数据库制作 django 管理面板?
- java - 生产者消费者问题中的饥饿如何发生
- angular2-services - 我还没有找到有关如何将数据从 AWS S3 获取到我的 Angular2 应用程序的任何信息。我是 AWS s3 的新手
- scheme - 应用程序:不是程序不匹配错误