微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

期望分布式表返回每个分片的结果,而不是聚合值

如何解决期望分布式表返回每个分片的结果,而不是聚合值

一个用户标签table_tag,对应的分布式表是table_tag_all,集群中有6个shard,sharding_key是intHash64(user_id).

通过设置参数distributed_product_mode='local'distributed_group_by_no_merge=1,返回的结果是6个独立分片的值,而不是一个聚合值。 >

以下是两个测试。 测试 1 得到了正确的结果(count_1 的数量的 6 条记录),但测试 2 是聚合的(只有 2 条记录)。 如何让测试 2 返回 6 个分片的结果?


    create table database.table_tag on cluster c1
    (
    user_id  String,tag1     String,dt
    )
    order by user_id
    partition by dt
    setting index_granularity=128;
    
    /* test 1: */
    select
    sum(case when tag1='1' then 1 else 0 end ) as count_1
    from database.table_tag_all
    where dt in ('202102','202101')
    SETTINGS distributed_group_by_no_merge=1;
    
    
    /* test 2: */
    select count_1,count(1) 
    from (
    select
    user_id,sum(case when tag1='1' then 1 else 0 end ) as count_1
    from database.table_tag_all
    where dt in ('202102','202101')
    group by user_id
    SETTINGS distributed_group_by_no_merge=1;
    ) t1
    group by count_1
    SETTINGS distributed_group_by_no_merge=1;
    
    /*
    count_1  count()
    0        1222122
    1        33821
    */

解决方法

试试这个查询:

SELECT
    shard_number,count_1,count()
FROM
(
    SELECT
        any(_shard_num) AS shard_number,countIf(tag1 = '1') AS count_1
    FROM database.table_tag_all
    WHERE dt in ('202102','202101')
    GROUP BY user_id
)
GROUP BY
    shard_number,count_1
SETTINGS distributed_group_by_no_merge = 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。