Apache Flink:为什么 sortPartition 转换不支持 KeySelector 函数
Apache Flink: Why does sortPartition transformation not support KeySelector functions
我正在使用 Apache Flink 的数据集 API,发现 sortPartition
转换仅支持位置和表达式键,但不支持键选择器函数。
我使用 java.util.Map
作为位置或表达式键不支持的数据类型。如何对 java.util.Map
等数据类型使用 sortPartition
转换?
Flink 的key selector 函数是语法糖,可以很容易地通过两个map 函数手动实现。
- 第一个
MapFunction
提取关键字段和returns一个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());
谢谢,它非常有用,那么我可以使用这种类似的方法来求解 sort-group 数据集上的聚合吗?
例如:
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());
我正在使用 Apache Flink 的数据集 API,发现 sortPartition
转换仅支持位置和表达式键,但不支持键选择器函数。
我使用 java.util.Map
作为位置或表达式键不支持的数据类型。如何对 java.util.Map
等数据类型使用 sortPartition
转换?
Flink 的key selector 函数是语法糖,可以很容易地通过两个map 函数手动实现。
- 第一个
MapFunction
提取关键字段和returns一个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());
谢谢,它非常有用,那么我可以使用这种类似的方法来求解 sort-group 数据集上的聚合吗?
例如:
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());