2013-07-09 30 views
0

我知道,一個人需要,以取代IN查詢相結合的半左連接(如Hive doesn't support in, exists. How do I write the following query?),但我不知道如何將它與一個WHERE子句結合:轉化蜂房subselect查詢與WHERE更換

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

謝謝。

編輯:更改了查詢。意圖是創建一個隨機的條目樣本(統計明智)。

+0

不知道你的查詢應該做什麼。你確定它是正確的嗎?查詢的輸入和預期輸出是什麼? –

+0

對不起,也許有點過於僞語法。子查詢應該返回一個隨機樣本的ids(limit + rand())。第一個選擇條款應該返回整個數據。我糾正了查詢更具表現力。 –

回答

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()

而且,這不會像你的查詢處理空值。

+0

抱歉錯別字,我糾正了在我最初的問題(rand()命令)中的子查詢。你在左半連接之後創建tmp表的技巧似乎有效。問題是查詢需要很長時間(仍在運行),因爲在Map/Reduce中只使用了1個Reducer。我會看到結果,並檢查爲什麼查詢是無用的。 –

+0

我猜你正在做ORDER BY rand() - 這將只會被1個reducer執行。如果你只是想要一個表的樣本,你可以創建它bucketed('CLUSTERED BY'),然後使用'TABLESAMPLE'在這裏描述:[link](https://cwiki.apache.org/confluence/display/Hive/LanguageManual + Sampling) – dimamah

+1

對您的查詢進行小幅更正:您需要用ON替換WHERE。感謝BUCKET提示。 –

2

(過帳完整性替代方法。)

從表中品嚐一組記錄,你可以使用蜂巢的TABLESAMPLE語法。例如,也可以選擇100個不同的userId的隨機樣本:

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); 

有關更多詳細信息,請查看the manual page for this topic

一旦你有了你的userId的樣本,你可以使用Manuel Aldana先前的答案從原始表格中選擇相應的記錄。