(копирование моего ответа от user@beam.apache.org)
Это интересно.Так что, если я понимаю ваш алгоритм, это будет что-то вроде (псевдокод):
A = ReadWithShardedLineNumbers(myFile) : output K<ShardOffset+LocalLineNumber>, V<Data>
B = A.ExtractShardOffsetKeys() : output K<ShardOffset>, V<LocalLineNumber>
C = B.PerKeySum() : output K<ShardOffset>, V<ShardTotalLines>
D = C.GlobalSortAndPrefixSum() : output K<ShardOffset> V<ShardLineNumberOffset>
E = [A,D].JoinAndCalculateGlobalLineNumbers() : output V<GlobalLineNumber+Data>
Это делает пару предположений:
ReadWithShardedLineNumbers
: источники могут выводить смещение их осколкаи смещения упорядочены глобально GlobalSortAndPrefixSum
: итоговые значения всех прочитанных осколков могут поместиться в памяти для выполнения общей сортировки
Предположение № 2 не будет выполняться для всехРазмеры данных и варьируются в зависимости от бегуна в зависимости от степени детализации чтения.Но это представляется возможным для некоторого практического подмножества размеров файлов.
Кроме того, я считаю, что приведенный выше псевдокод представлен в Beam и не потребует SplittableDoFn.