如何在python apache beam中命令窗口中的元素?

时间:2016-09-29 03:04:16

标签: python google-cloud-dataflow dataflow apache-beam

我注意到java apache beam有类groupby.sortbytimestamp python是否已实现该功能?如果不是在窗口中对元素进行排序的方法是什么?我想我可以在DoFn中对整个窗口进行排序,但我想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:6)

Beam中没有内置的值排序(Python或Java)。现在,最好的选择是在你提到的DoFn中自己对值进行排序。

答案 1 :(得分:1)

这是使用CombineFn的解决方案。它还有使用TreeSet对数据进行重复数据删除的额外好处。您还应该确保窗口的数据足够小,以适应单个工作人员的内存。

public static class DedupAndSortByTime extends Combine.CombineFn<MarketData, TreeSet<MarketData>, List<MarketData>> {
@Override
public TreeSet<MarketData> createAccumulator() {
    return new TreeSet<>(Comparator
            .comparingLong(MarketData::getEventTime)
            .thenComparing(MarketData::getOrderbookType));
}

@Override
public TreeSet<MarketData> addInput(TreeSet<MarketData> accum, MarketData input) {
    accum.add(input);
    return accum;
}

@Override
public TreeSet<MarketData> mergeAccumulators(Iterable<TreeSet<MarketData>> accums) {

    TreeSet<MarketData> merged = createAccumulator();
    for (TreeSet<MarketData> accum : accums) {
        merged.addAll(accum);
    }
    return merged;
}

@Override
public List<MarketData> extractOutput(TreeSet<MarketData> accum) {
    return Lists.newArrayList(accum.iterator());
}

}