分桶数据,如果桶大小大于 1,则将值设置为 1,否则为 0

Posted

技术标签:

【中文标题】分桶数据,如果桶大小大于 1,则将值设置为 1,否则为 0【英文标题】:Bucketing Data, If Bucket Size Greater Then 1 Set Value To 1 Else 0 【发布时间】:2020-08-31 21:22:34 【问题描述】:

我正在使用snowflake 尝试基于两列存储行,如果该存储桶大小大于 1,那么我需要一些新列的值为 1,否则我会将其设置为 0。它类似于NTILE(),只是我需要它是动态的。

我的表格如下所示:

ARTICLE_ID      USER_ID     COUNTRY_NAME    NUM_COUNTRIES   NUM_AUTHORS
------------------------------------------------------------------------
30522143        ecf330d     Singapore       1               4
30522143        86b0faa     Singapore       1               4
30522143        d331b33     Singapore       1               4
30522143        d331b33     Singapore       1               4
------------------------------------------------------------------------
30522139        1d08cfd     United States   2               3
30522139        ec9c065     Canada          2               3
30522139        a750bff     United States   2               3
------------------------------------------------------------------------
23410385        1d08cfd     United States   3               3
23410385        ec9c065     Mexico          3               3
23410385        a41b19c     France          3               3
------------------------------------------------------------------------
30285132        d331b33     Chile           2               4
30285132        1d08cf2     Peru            2               4
30285132        a750bff     Chile           2               4
30285132        d742bb5     Peru            2               4
------------------------------------------------------------------------
...

我需要存储的两列是ARTICLE_ID,然后是COUNTRY_NAME。查看上表,如果我们采用ARTICLE_ID30522143,我们将拥有14USER_ID,因为它们都是Singapore,那么HAS_REPEATED_COUNTRY 的值将是1。

ARTICLE_ID30522139的情况下,我们将有两个子存储桶一个用于United States,其中包含2USER_IDs,另一个子存储桶(Canada)包含1USER_ID,这将导致所有与United States 关联的用户的值都为1,而与Canada 关联的唯一成员在HAS_REPEATED_COUNTRY 中的值为0

因此表格类似于:

ARTICLE_ID      USER_ID     COUNTRY_NAME    NUM_COUNTRIES   NUM_AUTHORS     HAS_REPEATED_COUNTRY
------------------------------------------------------------------------------------------------
30522143        ecf330d     Singapore       1               4               1
30522143        86b0faa     Singapore       1               4               1
30522143        d331b33     Singapore       1               4               1
30522143        d331b33     Singapore       1               4               1
------------------------------------------------------------------------------------------------
30522139        1d08cfd     United States   2               3               1
30522139        ec9c065     Canada          2               3               0
30522139        a750bff     United States   2               3               1
------------------------------------------------------------------------------------------------
23410385        1d08cfd     United States   3               3               0
23410385        ec9c065     Mexico          3               3               0
23410385        a41b19c     France          3               3               0
------------------------------------------------------------------------------------------------
30285132        d331b33     Chile           2               4               1
30285132        1d08cf2     Peru            2               4               1
30285132        a750bff     Chile           2               4               1
30285132        d742bb5     Peru            2               4               1
------------------------------------------------------------------------------------------------
...

有没有办法从前者生成后者的表?

【问题讨论】:

应该是一个简单的Windowed Aggregatecase when count(*) over (partition by ARTICLE_ID, COUNTRY_NAME) > 1 then 1 else 0 end 【参考方案1】:

您似乎想为给定文章标记多次出现的国家/地区。如果是这样,您可以只使用窗口计数:

select 
    t.*,
    case when count(*) over(partition by article_id, country_name) > 1
        then 1 else 0
    end as has_repeated_country
from mytable t

【讨论】:

以上是关于分桶数据,如果桶大小大于 1,则将值设置为 1,否则为 0的主要内容,如果未能解决你的问题,请参考以下文章

hive分桶表实践

HIVE 分桶模式

Hive数据仓库分桶表分区未显示分区的数据

Hive篇--相关概念和使用二

Hive往分桶表表中导入数据

labview中如何大于0小于4