当前位置: 首页 > 知识库问答 >
问题:

如何在Apache Flink中的GroupedDataSet上平面映射函数

朱风史
2023-03-14

我想通过flatMap向数据集生成的每个组应用一个函数。groupBy(分组依据)。尝试调用flatMap时,我发现编译器错误:

error: value flatMap is not a member of org.apache.flink.api.scala.GroupedDataSet

我的代码:

var mapped = env.fromCollection(Array[(Int, Int)]())
var groups = mapped.groupBy("myGroupField")
groups.flatMap( myFunction: (Int, Array[Int]) => Array[(Int, Array[(Int, Int)])] )  // error: GroupedDataSet has no member flatMap

事实上,在flink-0.9-SNAPSHOT的留档中没有列出map或类似的。是否有类似的方法可以使用?如何在节点上单独实现每个组的所需分布式映射?

共有1个答案

邵骁
2023-03-14

您可以使用reduceGroup(GroupReduceFunction f)处理组中的所有元素。GroupReduceFunction为组中的所有元素提供了一个可伸缩的收集器,以及一个可发出任意数量元素的收集器。

Flink的groupBy()函数不会将多个元素分组为单个元素,即它不会将一组(Int, Int)元素(它们都共享相同的_1元组字段)转换为一个(Int, Array[Int])。相反,DataSet[(Int, Int)]是逻辑分组的,以便具有相同键的所有元素都可以一起处理。当您在GroupeDataSet上应用GroupRedu eFunction时,该函数将为每个组调用一次。在每次调用中,组的所有元素都一起交给该函数。然后,该函数可以处理组的所有元素,并将一组(Int, Int)元素转换为单个(Int, Array[Int])元素。

 类似资料:
  • 我正在使用Apache Flink尝试从Kafka获取JSON记录到InfluxDB,并在过程中将它们从一个JSON记录拆分为多个InfluxDB点。 我找到了转换,感觉它符合目的。核心代码如下所示: 出于某种原因,我只将其中一个收集的点流式传输到数据库中。 即使我打印出所有映射的条目,它似乎也能正常工作:产生: 我是否误解了平面图,或者流入连接器中是否存在一些错误?

  • 我对webflux比较陌生,我想找到解决方案,在有条件时避免嵌套flatMap: 如何防止这种分支条件平面映射混乱?我无法想象如果我在项目中有另一个实体。会有更多嵌套的平面地图?

  • 我有一个反应性的Web应用程序(Spring WebFlux)通过Azure Storage中的POST API存储用户配置文件图像。我需要为用户创建一个存储桶,如果它不存在的话。 服务层方法如下所示:(它包含嵌套的平面地图--这在反应性应用程序中被认为是一种不好的做法,而且是一种代码气味。)我想重构,这样就没有嵌套的平面地图。有什么办法可以做到这一点吗?

  • 我有以下代码: 如果我想迭代Map,上面的代码工作得很好。但是现在我有这样的东西。 我想在映射中遍历映射,并获取它的键和值。我想得到key1、value1、key2、value2、key3、value3的值,依此类推。那我该怎么做呢?

  • 我在spark中有一个数据集,只有一列,这列是一个Map[String,Any]。我想逐行映射数据集,然后逐键映射映射映射列,计算每个键的值,并使用新数据生成与前一个相同类型的新数据集。 例如: 我想在每个值的末尾加上“”,结果将是一个数据类型的数据集,如下所示: 谢谢Nir

  • 我有我创建的地图的地图 我尝试在第二个映射中迭代键的值。 所以它可以是这样的: key1->keya->value1 -------->键->值2 -------->键->值4 -------->KeyC->value1 我想继续多久就继续多久。 因此,我有,并尝试使用名为的值变量和增量计数器if来循环中的所有值 我不知道如何获得。我试着这样做 但这给了我信笺。 如果我执行,它会给出我想要的正确值