Colocate Join
Для shuffle join и broadcast join, если условие соединения выполняется, строки данных из двух соединяемых таблиц объединяются на одном узле для завершения соединения. Ни один из этих двух методов соединения не может избежать задержки или накладных расходов, вызванных сетевой передачей данных между узлами.
Основная идея заключается в том, чтобы сохранить ключ бакетинга, количество копий и размещение копий согласованными для таблиц в одной группе Colocation Group. Если столбец соединения является ключом бакетинга, вычислительному узлу нужно выполнить только локальное соединение без получения данных с других узлов. Colocate Join поддерживает equi joins.
Этот документ знакомит с принципом, реализацией, использованием и соображениями по использованию Colocate Join.
Терминология
- Colocation Group (CG): CG будет содержать одну или несколько таблиц. Таблицы в CG имеют одинаковый бакетинг и размещение реплик, и описываются с помощью Colocation Group Schema.
- Colocation Group Schema (CGS): CGS содержит ключ бакетинга, количество buckets и количество реплик CG.
Принцип
Colocate Join заключается в формировании CG с набором таблиц, имеющих одинаковый CGS, и обеспечении того, чтобы соответствующие копии bucket этих таблиц находились на одном и том же наборе узлов BE. Когда таблицы в CG выполняют операции Join по столбцам бакетинга, локальные данные могут быть соединены напрямую, что экономит время на передачу данных между узлами.
Bucket Seq получается путём hash(key) mod buckets. Предположим, таблица имеет 8 buckets, тогда есть [0, 1, 2, 3, 4, 5, 6, 7] 8 buckets, и каждый Bucket имеет один или несколько подтаблиц, количество подтаблиц зависит от количества партиций. Если это мультипартиционная таблица, будет несколько tablets.
Чтобы иметь одинаковое распределение данных, таблицы в пределах одной CG должны соответствовать следующему.
- Таблицы в пределах одной CG должны иметь идентичный ключ бакетинга (тип, количество, порядок) и одинаковое количество buckets, чтобы фрагменты данных нескольких таблиц могли распределяться и контролироваться один за другим. Ключ бакетинга — это столбцы, указанные в операторе создания таблицы
DISTRIBUTED BY HASH(col1, col2, ...). Ключ бакетинга определяет, какие столбцы данных хешируются в разные Bucket Seqs. Имя ключа бакетинга может отличаться для таблиц в пределах одной CG. Столбцы бакетинга могут отличаться в операторе создания, но порядок соответствующих типов данных вDISTRIBUTED BY HASH(col1, col2, ...)должен быть точно таким же. - Таблицы в пределах одной CG могут иметь разное количество партици й и разные ключи партиционирования.
При создании таблицы CG указывается атрибутом "colocate_with" = "group_name" в PROPERTIES таблицы. Если CG не существует, это означает, что таблица является первой таблицей CG и называется Parent Table. Распределение данных Parent Table (тип, количество и порядок ключей разделения bucket, количество копий и количество разделённых buckets) определяет CGS. Если CG существует, проверяется, согласуется ли распределение данных таблицы с CGS.
Размещение копий таблиц в пределах одной CG удовлетворяет:
- Сопоставление между Bucket Seq и узлами BE всех таблиц такое же, как у Parent Table.
- Сопоставление между Bucket Seq и узлами BE всех партиций в Parent Table такое же, как у первой Partition.
- Сопоставление между Bucket Seq и узлами BE первой Partition Parent Table определяется с использованием нативного алгоритма Round Robin.
Согласованное распределение данных и сопоставление гарантируют, что строки данных с одинаковым значением, взятым ключом бакетинга, попадают на один и тот же BE. Поэтому при использовании ключа бакетинга для соединения столбцов требуются только локальные соединения.