匹配行的计数并从 hive 中的每个计数组中选择 30

Posted

技术标签:

【中文标题】匹配行的计数并从 hive 中的每个计数组中选择 30【英文标题】:count of matching rows and select 30 from each count group in hive 【发布时间】:2016-01-07 06:32:02 【问题描述】:

如何计算以下示例数据的匹配行数

ID    Attribute 1  Attribute 2 
        1   A   AA 
        2   B   CC 
        3   C   BB 
        4   A   AA 
        5   C   BB 
        6   D   AA 
        7   B   AA 
        8   C   DD 
        9   A   AB 
        10  A   AA 

输出应该是这样的

 ID    Attribute 1  Attribute 2     count(Attribute1+Attribute2)
        1   A   AA  3
        2   B   CC  1
        3   C   BB  2
        4   A   AA  3
        5   C   BB  2
        6   D   AA  1
        7   B   AA  1
        8   C   DD  1
        9   A   AB  1
        10  A   AA  3

然后从每个计数组中选择 50% 的行。例如:对于 mtaching 行 (A,AA),我只需要选择 2 次出现。这会给我 ID(1 和 4)

【问题讨论】:

【参考方案1】:

您可以像这样使用 SQL 查询。

SELECT *, 
       (SELECT COUNT(*)
        FROM table AS t2
        WHERE t1.[Attribute1] = t2.[Attibute1] 
          AND t1.[Attribute2] = t2.[Attibute2]) AS 'count(Attribute1+Attribute2)' 
FROM table AS t1

【讨论】:

这是无效的 Hive 语法。选择语句中不能有子查询。【参考方案2】:

这里是查询:

select * from (select product_category_id,
count(1) over (partition by product_category_id) cnt,
row_number() over (partition by product_category_id) rn
from products) p where rn <= 0.5 * cnt;

这是示例结果,product_category_id,cnt,然后是行号。在您的情况下,您需要在 partition by 子句中包含两个属性。

59  24  1
59  24  2
59  24  3
59  24  4
59  24  5
59  24  6
59  24  7
59  24  8
59  24  9
59  24  10
59  24  11
59  24  12

【讨论】:

以上是关于匹配行的计数并从 hive 中的每个计数组中选择 30的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:列计数与第 1 行的值计数不匹配,并且我的数据库的第 1 列是自动记录的

apache Pig 试图在每个组中获得最大计数

列计数与第 1 行的值计数不匹配 VendorError:1136

错误消息(列计数与第 1 行的值计数不匹配)[重复]

SQL 错误列计数与第 1 行的值计数不匹配

在 groupby (Multiindex) 之后从每个组中选择第一行