2016-11-05 4 views
1

работы (идентификатор, звание)MySQL запросов к Hiveql

данные:

work 
------------------ 
1 | A 
1 | B 
1 | C 
1 | D 
2 | A 
2 | C 
2 | B 
3 | C 

Мне нужно найти все пары идентификаторов, которые имеют общий ранг их подсчет, и он должен отображаться только если кол ранг больше 2 и печатать их в порядке убывания. Я написал для этого mysql-запрос, но я новичок в SparkSQL и HIVEQL. Поэтому, пожалуйста, помогите мне, как это сделать. Например, используя данные выше результирующего набора должны быть:

MySQL запрос:

select a.id,b.id 
from work as a, work as b 
where a.id>b.id 
group by a.id,b.id having group_concat(distinct a.rank order by a.rank)=group_concat(distinct b.rank order by b.rank) 

--------------------- 
id1 | id2 | Count 
--------------------- 
A | B | 3 
B | C | 3 
+0

И как определяется 'rank'? –

ответ

1

Я не думаю, что улей поддерживает group_concat(). Я думаю, что это делает то же самое:

select a.id, b.id, a.cnt 
from (select a.*, count(*) over (partition by a.id) as cnt 
     from work a 
    ) a join 
    (select b.*, count(*) over (partition by b.id) as cnt 
     from work b 
    ) b 
    on a.rank = b.rank and a.cnt = b.cnt 
where a.id < b.id -- I *think* this is allowed in Hive; it not, a subquery or expression in the `having` clause will do the same thing 
group by a.id, b.id, a.cnt 
having count(*) = a.cnt; 

Это более естественным способ получить пар идентификаторов с тем же рейтингом. Фактически, он должен быть более эффективным практически в любой базе данных, чем версия MySQL. cross join генерирует много данных.

+0

Спасибо, я попробую! Но, я хочу только пары, и только если общее количество рангов между обоими пользователями выше 3, и я хочу, чтобы они были в desc – Rushabh