0

我知道需要用半左连接替换 IN 查询(​​例如,Hive 不支持 in,存在。我如何编写以下查询?),但我不知道如何将它与 WHERE 子句结合起来:

SELECT * 
          from foo 
          WHERE userId IN 
             (SELECT distinct(userId) FROM foo WHERE x=true ORDER BY RAND() LIMIT 100);

谢谢。

编辑:更改查询。目的是创建条目的随机样本(统计方面)。

4

2 回答 2

2

(发布替代方法以确保完整性。)

要从表中采样一组记录,您可以使用 Hive 的TABLESAMPLE语法。例如,也可以选择一个包含 100 个不同用户 ID 的随机样本,您将使用:

SELECT userId 
FROM (SELECT DISTINCT(userId) as userId FROM foo) f
TABLESAMPLE(100 ROWS); 

该语法允许您以不同的方式指定样本大小。以下也是有效的:

SELECT userId 
FROM (SELECT DISTINCT(userId) as userId FROM foo) f
TABLESAMPLE(1 PERCENT); 

有关更多详细信息,请查看此主题的手册页

获得用户 ID 样本后,您可以使用 Manuel Aldana 早期的答案从原始表中选择相应的记录。

于 2013-07-24T10:58:15.990 回答
1
select id from foo 
left semi join 
(SELECT id_2 FROM bar WHERE x=true RAND() LIMIT 100) x
ON foo.id=x.id_2

应该是这样的。
我只是不明白这部分:x=true RAND()

此外,这不会像您的查询一样处理空值。

于 2013-07-10T16:06:37.573 回答