2016-09-29 9 views
3

자바 아파치 빔에 groupby.sortbytimestamp 클래스가 있다는 것을 알게되었습니다. 파이썬에는 아직 구현 된 기능이 있습니까? 그렇지 않은 경우 창에서 요소를 정렬하는 방법은 무엇입니까? DoFn에서 전체 창을 정렬 할 수 있다고 생각하지만, 더 좋은 방법이 있는지 알고 싶습니다.어떻게 파이썬 아파치 빔 창에서 요소를 주문할 수 있습니까?

+0

는 어디 클래스를 찾는? 더 이상 존재하지 않는다고 생각합니다 : https://github.com/apache/beam/search?utf8=%E2%9C%93&q=sortbytimestamp&type= – skeller88

답변

6

빔 (Python 또는 Java)에 내장 된 값 정렬이 없습니다. 바로 지금, 가장 좋은 방법은 언급 한 것처럼 DoFn에서 직접 값을 정렬하는 것입니다.

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()); 
} 

}