2016-01-26 2 views
5

Я очень новичок в использовании Google Cloud Dataflow. Я хотел бы получить декартово произведение двух PCollections. Например, если у меня есть два PCollections (1, 2) и ("hello", "world"), их декартово произведение ((1, "hello"), (1, "world"), (2, "hello"), (2, "world")).Как получить декартовое произведение из двух PCollections

Любые идеи, как я мог это сделать? Кроме того, поскольку декартово произведение может быть большим, я надеюсь, что решение будет лениво создавать продукт и тем самым избежать огромного потребления памяти.

Спасибо!

+0

У вас есть более подробная информация о том, что вы пытаетесь сделать? Насколько велики каждый из PCollections? Существует несколько способов достижения этой цели, и какая из них лучше зависит от причины, по которой вы хотите декартовой продукции и фактических PCollections. –

+0

Два PCollections идентичны. Они содержат примерно 100 000 кортежей типа '(String, String)'. Я использую словарь английских слов и получаю их фонетическую транскрипцию, чтобы генерировать каламбуры из 2 слов, такие как: «fantasti-CAL-ifornia». –

+0

Для прямого декартового решения [this] (http://stackoverflow.com/a/41051283/377366) представляется лучшим ответом на данный момент. – KobeJohn

ответ

3

В целом, вычисление декартова продукта будет дорогостоящим. Если (или оба) коллекций подходят в память, вы можете использовать side-inputs для передачи данных всем работникам. Итак, для вашего примера вы превратите PCollection<String> в боковой вход, а затем у вас будет ParDo, который взял его как основной вход. Для каждой строки на главном входе вы можете получить доступ к боковому вводу, который имеет Iterable<String> всех значений, и вы должны выводить пары (или вы могли бы в этом DoFn выбрать вывод только пары, которые выстраиваются в линию).

Это будет повторяться по всему набору слов каждый раз - если он подходит в памяти, это должно быть хорошо. Если он должен повторно извлекать боковые входные данные каждый раз, когда это может быть проблематично.

Другой подход - полагаться на перетасовку и ключи. Скажем, вы хотели найти слова с 3-буквенным перекрытием. Вы можете обработать словарь и создать PCollection значений, с помощью трехбуквенных префиксов. Вы также можете создать аналогичные PCollection с помощью трехбуквенных суффиксов. Затем вы можете GroupByKey (или CoGroupByKey). После этого у вас есть для каждого 3-буквенного ключа, все слова с этим как префикс и это как суффикс.

+0

Спасибо за вход! Я, вероятно, пойду с помощью метода GroupByKey! –

+3

На самом деле это не отвечает на вопрос о том, как сделать декартовой продукт. – Max

Смежные вопросы