Scala 将reduceByKey从Spark转换为Flink

Scala 将reduceByKey从Spark转换为Flink,scala,apache-spark,apache-flink,Scala,Apache Spark,Apache Flink,如何将这个示例scala spark代码转换为ApacheFlink reduceByKey( (x, y) => (x._1 + y._1, ( (x._2) ++ y._2) ) ) 我意识到,reduceByKey在flink中并不存在,但它显示了我正在努力实现的目标 谢谢你的帮助 reduceByKey基本上将函数(V,V)=>V应用于按键分组的(K,V)键值对的值。等效的“普通scala”实现: reduceByKey( (v1, v2) => (v1._1 + v2._

如何将这个示例scala spark代码转换为ApacheFlink

reduceByKey( (x, y) => (x._1 + y._1, ( (x._2) ++ y._2) ) )
我意识到,
reduceByKey
在flink中并不存在,但它显示了我正在努力实现的目标


谢谢你的帮助

reduceByKey
基本上将函数
(V,V)=>V
应用于按键分组的
(K,V)
键值对的值。等效的“普通scala”实现:

reduceByKey( (v1, v2) => (v1._1 + v2._1, ( (v1._2) ++ v2._2) ) )
可以是:

groupBy(_._1).mapValues(_.values.reduce((v1, v2) => ...))
groupBy(0).reduce { (v1, v2) => (v1._1 + v2._1, ( (v1._2) ++ v2._2) ) }
(如果我没弄错的话)


可能的flink实现可以是:

groupBy(0).reduce { (v1, v2) => (v1._1 + v2._1, ( (v1._2) ++ v2._2) ) }
按键分组,然后按应用于值的函数减少


在@Till解释后编辑

然后调用reduce操作时,整个对象将 给出了reduce函数,而不仅仅是value部分


与Spark不同,Flink不需要键值对来执行reduce、join和coGroup操作。它可以在任何类型(如POJO、元组或用户类型)上直接执行它们。你必须提供给Flink的是它必须分组的领域。这可以是提取关键字、逻辑索引或字段名称的函数。然后调用
reduce
操作时,整个对象将被赋予reduce函数,而不仅仅是值部分

因此,假设您有一个
input:DataSet[(K,(T,List[U])]
,其中
K
是键类型,那么您的reduce函数如下所示:

input.groupBy(0)。减少{
(左:(K,(T,List[U])),右:(K,(T,List[U]))=>
val(键,(leftValue1,leftValue2))=左
val(40;,(rightValue1,rightValue2))=右
(键,(leftValue1+rightValue1,leftValue2++rightValue2))
}
为了理解,我还为匿名函数提供了类型注释。但这并不是必须的

更新 这是针对Humberto特定用例的解决方案,假设输入字段由包含3个条目的行组成,空格分隔,第三个条目是整数:

val input = env.readCsvFile[(String, String, Int)](filePath, lineDelimiter = "\n", fieldDelimiter = " ")

val result = input
  .map (element => (element._1, element._3, Map(element._2 -> element._3)))
  .groupBy(0)
  .reduce{
    (left, right) =>
      val (key, left1, left2) = left
      val (_, right1, right2) = right

      (key, left1 + right1, left2 ++ right2)
  }

可能是使用.groupBy(0).reduce()?所以我尝试了:val target=words.map(line=>(line(0),(line(2).toInt,map((line(1)->line(2).toInt(0).groupBy(0).reduce{(x,y)=>(x.[u 1+y.[u 1,((x.[u 2)++y.[u 2]))+”:“value++不是(Int,scala.collection.immutable.map[String,Int])的成员。”。真的,我不知道为什么。TKST感谢您的帮助,但仍然会出错。Spark中完整的原始行是:val target=words.map(line=>(line(0),(line(2).toInt),map(line(1)->line(2.toInt)))。reduceByKey((x,y)=>(x._1+y._1,((x._2)+y._2)),我尝试使用新代码,但sintaxe错误仍然存在。tks尝试帮助我。Spark代码中的完整行是:val target=words.map(line=>(line(0),(line(2.toInt),map(line(1)->line(2.toInt)))。reduceByKey((x,y)=>(x._1+y._1,((x._2)+y._2)),我不知道如何在Flink中重写它。我是新手。@HumbertoMoura,
行的类型是什么?这是字符串数组吗?行是使用readTextFile()val sc=ExecutionEnvironment.getExecutionEnvironment val input=sc.readTextFile()从文本文件读取的字行file:///Users/humberto/Documents/mini.1“”)val words=input.map(line=>line.split(“”)val target=words.map(line=>(第(0)行),(第(2)行).toInt…我已经更新了我的答案,以反映您的特定用例。这行代码有效。但是,通过此更改,不幸的是,生成了更多3个错误。我所有的原始代码都在这里:我对您的提示进行了最佳尝试:我真的需要转换此代码,因为我正在其他大数据实验中使用。非常感谢您的帮助。