Функция TopK над распределенным движком In clickhouse возвращает только 10 записей - PullRequest
1 голос
/ 06 января 2020

Я выполняю следующий запрос select topK(30)(Country) from distributed_table

примечание: механизм распределенной_таблицы - Распределенный.

, и хотя существует более 100 возможных значений "страны", запрос возвращает только 10 .

Кроме того, когда я запускаю его на локальной таблице, я получаю более 10 результатов.

Я пропустил какую-то важную конфигурацию?

1 Ответ

0 голосов
/ 07 января 2020

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

Давайте проверим результаты для каждого шарда (будем использовать distrib_group_by_no_merge -setting, чтобы отключить объединение промежуточных результатов для каждого сегмента):

select any(_shard_num), topK(30)(Country) 
from distributed_table
SETTINGS distributed_group_by_no_merge = 1

На каждом фрагменте функция topK работает правильно, поэтому в качестве обходного пути вы можете объединить все промежуточные результаты вручную:

SELECT arrayDistinct(
  arrayMap(x -> x.1, 
    /* sort values by frequency */
    arraySort(x -> x.2, 
      /* converts an array of arrays to a flat array */
      flatten(
        /* group results from shards to one array */
        groupArray(
          /* assign each value the index number */
          arrayMap((x, index) -> (x, index), shard_result, arrayEnumerate(shard_result))))))) ordered_value
FROM (
  select topK(30)(Country) AS shard_result
  from distributed_table
  SETTINGS distributed_group_by_no_merge = 1)
...