如何将此示例scala spark代码转换为apache flink?
reduceByKey( (x, y) => (x._1 + y._1, ( (x._2) ++ y._2) ) )
我意识到reduceByKey
在flink中不存在,但它显示了我想要实现的目标。
谢谢你的任何帮助!
答案 0 :(得分:4)
与Spark不同,Flink不需要键值对来执行reduce,join和coGroup操作。它可以直接在任何类型(如POJO,元组或用户类型)上执行它们。你必须提供给Flink的是它必须分组的领域。这可以是提取密钥的函数,逻辑索引或字段的名称。然后,当您调用reduce
操作时,整个对象将被赋予reduce函数,而不仅仅是值部分。
假设您的input: DataSet[(K, (T, List[U]))]
K
是键类型,那么您的reduce函数将如下所示:
input.groupBy(0).reduce{
(left: (K, (T, List[U])), right: (K, (T, List[U]))) =>
val (key, (leftValue1, leftValue2)) = left
val (_, (rightValue1, rightValue2)) = right
(key, (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)
}
答案 1 :(得分:1)
type="video/mp4"
基本上将函数reduceByKey
应用于按键分组的(V, V) => V
键值对的值。等效的“普通scala”实现:
(K, V)
可能是:
reduceByKey( (v1, v2) => (v1._1 + v2._1, ( (v1._2) ++ v2._2) ) )
(如果我做对了)
可能的flink实现可能是:
groupBy(_._1).mapValues(_.values.reduce((v1, v2) => ...))
按键分组,然后按值上应用的函数缩小。
@Till解释后编辑
然后当你调用reduce操作时,那么整个对象就是 给予reduce函数而不仅仅是值部分。
groupBy(0).reduce { (v1, v2) => (v1._1 + v2._1, ( (v1._2) ++ v2._2) ) }