2016-03-20 7 views
0

私は両方の方が好きな映画のa.user_idとb.user_id数を返すHIVEクエリを作成しようとしています。クエリを実行すると、a.user_id、b.user_id、count、および一連のムービーが取得されます。また、b.user_id、a.user_id、カウント、およびムービーのセットも取得します。クエリのフィルタ逆ペアリング

私の質問は、どのようにしてa.user_id、b.user_id数、およびムービーセットのみに制限するのですか。

A、B、25、映画

B、Aのリスト、:私はすでにON(a.movie_id = b.movie_id AND a.user_id < b.user_id)

SELECT a.user_id, b.user_id, count(*) AS num, collect_set(m.movie_title) 
FROM ratings a 
JOIN ratings b 
ON (a.movie_id = b.movie_id) 
JOIN movies m 
ON (a.movie_id = m.movie_id AND b.movie_id = m.movie_id) 
WHERE (a.user_id <> b.user_id) 
GROUP BY a.user_id, b.user_id; 
ORDER BY num DESC; 

にライン4をchaningによってRemove reverse duplicates from an SQL queryに電流出力を提案された解決策を試みてきた

25、ムービー一覧

希望出力:

A、B、映画

+2

をなぜ提案されたソリューションが動作しませんか? –

+0

私は自己結合をしていて、どこのステートメントを変更するときに自分自身のuser_idに参加し始めたからだと思います。たとえば、ファイルサイズは172.9kbでしたが、それを変更するとファイルサイズは17.8MBになりました。私が出力を確認すると、一致するフィルムの数は6-138の範囲からなり、現在は300,000の大きさになっています。 –

答えて

1

の25リスト私はあなたがなりたいの問合せ期待:

SELECT a.user_id, b.user_id, count(*) AS num, collect_set(m.movie_title) 
FROM ratings a JOIN 
    ratings b 
    ON a.movie_id = b.movie_id JOIN 
    movies m 
    ON a.movie_id = m.movie_id 
WHERE a.user_id < b.user_id 
GROUP BY a.user_id, b.user_id 
ORDER BY num DESC; 
+0

また、ANDステートメントを削除するとループが停止する原因になっているのだろうかと思います。ありがとうございました。ところで、2行目から最後の行に余分なセミコロンがあります。 –

+0

@BennyBaysinger。 。 。うーん。遠隔で可能です。元の 'join'条件は冗長なので、結果セットには影響しません。ただし、クエリプランに影響する可能性があります。 –

+0

私は 'AND'の有無にかかわらず試しました。期待通りの正確なクエリー。私はあなたの提案したソリューションと以前のポスターのソリューションを試してみました。私は同じ解決策で質問にタグを付けることさえできました。私は別のタイプミスをしていたに違いありません。とにかく、完璧にうまくいけば、それは同じ問題を持つ他の誰かを助けるでしょう。 –

関連する問題