Как получить доступ к "ключу" в comb.perKey в луче

В разделе Как создать собственный Combine.PerKey в beam sdk 2.0 я спросил и получил правильный ответ о том, как создать собственный Combine.PerKey в новом beam sdk 2.0. Однако теперь мне нужно создать пользовательский combPerKey так, чтобы в рамках моей собственной логики CombinePerKey мне был необходим доступ к содержимому ключа. Это было легко возможно в потоке данных 1.x, но в новом луче SDK 2.0 я не уверен, как это сделать. Любой небольшой фрагмент кода / пример был бы чрезвычайно полезен.

РЕДАКТИРОВАТЬ #1 (по запросу Бена Чемберса)

Реальный вариант использования сложно объяснить, но я попробую:

У нас есть трехмерное пространство, состоящее из миллионов маленьких холмов. Мы пытаемся определить вершину этих миллионов холмов следующим образом: мы создаем миллиарды "прямоугольных зондов" для всего трехмерного пространства, а затем просим каждый из этих миллиардов зондов "жадно" двигаться к вершине. Как только он достигает вершины, он останавливается. Затем зонд возвращает апекс и себя. Апекс - это КЛЮЧ, для которого мы будем делать пользовательское объединение по ключу.

Теперь пользовательская функция объединения собирается, наконец, вернуть конечный объект (называемый функцией), который получен из всех зондов, которые достигают одной и той же вершины (то есть того же ключа). При создании этого "особенного" объекта нам нужно знать информацию о конечном апексе / ключе (то есть вершине холма). Следовательно, мне нужна эта ключевая информация.

Одним из способов решения этой проблемы является использование группы по ключу, но это было медленно (по крайней мере, в df 1.x); мы сделали это быстро (в df 1.x), используя пользовательский комбайн fn. Итак, нам нужен ключ. Тем не менее, groupbykey работает в луче SKD 2.0.

В качестве альтернативы, мы могли бы вставить информацию "апекса" в сами объекты "зонда", но это означает, что каждый из наших миллиардов объектов зонда теперь должен быть утроен в размерах только для хранения этой информации вершины (и эта информация вершины повторяется, поскольку есть, скажем, 1 миллион вершин, но 1 миллиард зондов, так что это интуитивно кажется крайне неэффективным.)

1 ответ

Вместо того, чтобы полагаться на CombineFn для вычисления всего результата, вы могли бы вместо этого заставить ComibneFn вычислять какой-то частичный результат, основываясь только на информации о датчиках? Тогда ваш Combine.perKey(...) возвращает PCollection<KV<Apex, InfoAboutProbes>> и вы можете использовать ParDo объединить информацию о вершине со сводной информацией о пробниках. Это позволяет вам использовать CombineFn для эффективного объединения информации о многих датчиках при использовании ParDo чтобы получить доступ к ключу.

Другие вопросы по тегам