来自蜂巢表

时间:2015-10-16 13:38:23

标签: hive

我有一个hive表格activity,其中包含useriditemidrating列,可能的评分为1和0,其中有更多正面评分(1s)然后负评级(0s)。我需要提取具有大致相等数量的正负评级的样本。我需要这个样本尽可能大,所以想要对所有负评级行进行采样,加上相等数量的正评级行,随机抽样

例如,我们假设表中的总行数为10万,其中75k的评级为1,而25k的评级为0。什么是最有效的查询(或查询)返回所有25k行,其中rating = 0和25k随机采样的行,其中rating = 1?实际的表格要大得多,所以速度在这里很重要。

3 个答案:

答案 0 :(得分:1)

如果您事先知道负面因素是限制因素,您可以使用第一个查询获得确切的数字(假设为N)。 然后你可以得到整个样本(这里是硬编码N)

select * from
(
  select * from activity where rating=1 order by rand() limit N
  union all
  select * from activity where rating=0  
) all_sample
order by rand() limit 2N

根据您的需要,可能没有必要使用最后一个订单。

答案 1 :(得分:1)

正如这里建议的那样(http://www.joefkelley.com/736/),rand()只会在一个reducer中随机化。如果您的数据集中存在数据偏差(例如,如果您不通过随机分配的密钥进行分发),您可能会看到结果偏差。

首先确保使用DISTRIBUTE BY您的密钥,然后使用带限制的rand()返回N值。

答案 2 :(得分:0)

如果有很多类,您可以使用以下查询在所有类中获取样本,而无需多次编写查询:

select * from 
    (select userid, item_id, rating, 
    row_number() over(partition by rating  order by rand()) as rn 
    from activity
    ) a 
where rn <= x

x可以是您希望每个班级的计数。