Я написал этот вопрос, чтобы ответить на него сам.
Что происходит под капотом:
- Данные, отправленные с помощью потока данных между PCollections (сериализуемые объекты), могут не существовать на одном компьютере. Кроме того, для преобразования, подобного GroupByKey / CoGroupByKey, требуется, чтобы все данные были собраны в одном месте до заполнения результирующего значения.
- Недавно я работал над огромным набором данных с 970 столбцами информации. Теперь эти данные огромны (PCollecction около 300 ГБ). В моем сценарии использования мне пришлось объединить эту информацию с другой PCollection (PCollecction с 5 столбцами) с CoGroupByKey, и когда данные были переданы как есть, для их подготовки потребовались часы он может даже выполнить операцию группировки.
1012 * Обход *
- Уменьшите размер строки, чтобы у вас была только необходимая информация для присоединения к коллекции
Например, если у вас есть 1 ключевой столбец в левой коллекции и вам нужен 1 столбец значений из правой коллекции, передайте только эту информацию в преобразования CoGroupByKey. Хотя это приведет к потере данных вашей исходной коллекции, вы создадите поисковую коллекцию, в которой содержится информация о том, что вам нужно на основе KV.
Затем вы можете использовать DoFn для обхода ваших данных, восстановления ключа и извлечения данных из данных с карты, переданной в качестве бокового ввода.
Этот подход дает потрясающие результаты, и это позволило мне объединить данные, упомянутые выше, в течение 5 минут.