Apache Flink:为什么sortPartition转换不支持KeySelector函数

时间:2016-01-07 03:56:46

标签: java apache-flink

我正在使用Apache Flink的DataSet API,发现sortPartition转换仅支持位置和表达式键,但不支持键选择器函数。

我使用java.util.Map作为位置或表​​达式键不支持的数据类型。如何对数据类型(例如sortPartition

)使用java.util.Map转换

2 个答案:

答案 0 :(得分:3)

Flink的键选择器功能是语法糖,可以使用两个地图功能轻松手动实现。

  • 第一个MapFunction提取关键字段并返回Tuple2<Key, Input>,其中关键字段是提取的关键字,输入字段是原始输入(在您的情况下为Map)。
  • 使用第一个元组字段(索引0)上的位置键对结果数据集进行排序。
  • 第二个MapFunction打开Tuple2<Key, Input>元组的输入字段。

整体代码如下:

DataSet<Map> input = ...
DataSet<Tuple2<Long, Map>> keyed = input.map(new KeyExtractMap());
DataSet<Tuple2<Long, Map>> sortedKeyed = keyed.sortPartition(0, Order.ASCENDING);
DataSet<Map> sorted = sortedKeyed.map(new UnwrapMap());

答案 1 :(得分:0)

谢谢,它非常有用,我可以使用这种类似的方法来解决排序组数据集上的聚合吗?

例如:

DataSet<Map> input = ...

DataSet<<Tuple4<Long,Long,Long,Map>> keyed = input.map(new KeyExtractMap());

DataSet<<Tuple4<Long,Long,Long,Map>> sortGrouped = keyed.groupBy(0).sortGroup(1,Order.ASCENDING).sortGroup(2,Order.ASCENDING);

DataSet<Map> result = sortGrouped.map(new UnwrapMap());