topk函数只返回10条记录

falq053o  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(423)

我正在运行以下查询 select topK(30)(Country) from distributed_table 注意:分布式表的引擎是分布式的。
即使有超过100个可能的“country”值,查询也只返回10个。
而且,当我在本地表上运行它时,我会得到10个以上的结果。
我错过了一些重要的配置吗?

r8uurelv

r8uurelv1#

当碎片的中间结果与最终结果相结合时,问题似乎就出现了。
让我们检查每个shard的结果(将使用distributed\u group\u by\u no\u merge-setting来禁用合并每个shard的中间结果):

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

在每个shard上,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)

相关问题