вы не можете использовать collect_list
, так как это недетерминировано c сбор элементов по группе, см. Do c -
/**
* Aggregate function: returns a list of objects with duplicates.
*
* @note The function is non-deterministic because the order of collected results depends
* on order of rows which may be non-deterministic after a shuffle.
*
* @group agg_funcs
* @since 1.6.0
*/
def collect_list(e: Column): Column = withAggregateFunction { CollectList(e.expr) }
В распределенных вычислениях сбор элементов по определенным порядок невозможен, поскольку данные распределяются по узлам. Для этого вам нужно собрать данные в один раздел на исполнителе, а затем выполнить агрегирование. This may cause Resource crunch on the executor
. Если вы знаете, что количество ваших данных меньше , вы можете сделать это, используя UDAF
, объединив данные в 1
.
Если у вас есть столбец с перераспределением разделов который не искажается, вы можете выполнить это действие эффективным и надежным способом
Вот хороший пример для сортировки значений на основе метки времени с помощью cloudera