2014-10-29 1 views
1

Я не совсем уверен, что это хороший вопрос, но я объясню, насколько это возможно в теле.Улей: Повторите SELECT для каждой строки

Я работаю с миллионами песен Dataset, от http://labrosa.ee.columbia.edu/millionsong/

Моей конечной целью является создание что-то вдоль линий «подобной песни», в котором я беру песню и получить подобные песни на год, продолжительность и т.д.

у меня есть данные в таблице улья, установленные в качестве

CREATE TABLE IF NOT EXISTS songs(genre String, artist String, danceability Double, duration Double, loudness Double, similarArtists String, hotness Double, title String) PARTITIONED BY(year String) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; 

Моя проблема возникает потому, что улей не поддерживает неравенства в JOIN.

В идеале я хотел бы иметь запрос как

SELECT songs.artist, songs.title, t2.title FROM songs JOIN songs as t2 ON songs.year > t2.year -5 AND songs.year < t2.year +5; 

Однако это не представляется возможным в настоящее время. Я в настоящее время тупик, чтобы наилучшим образом попытаться выполнить подобный запрос. Это можно сделать в SELECT, даного

SELECT title FROM songs WHERE year < 2000 + 5 AND year > 2000 - 5; 

Но я не уверен, как это делать в каждом ряду, а принимая apropriate значения вместо жесткого кодирования 2005 IE:

SELECT title FROM songs WHERE year < song.year + 5 AND year > song.year-5; 

Кто-нибудь столкнуться с ситуацией, подобной этой, или иметь какие-то общие идеи, которые я мог бы попробовать?

ответ

1

Вы можете сделать перекрестное соединение и подмножество в п где:

select songs.artist, songs.title, t2.title 
from songs 
cross join songs as t2 
where songs.year between (t2.year - 5) and (t2.year + 5) 
; 

Имейте в виду выше будет также соответствовать каждой песни к себе. Вам потребуется другое ограничение для удаления этих записей, если это необходимо.

+0

Спасибо за тонну, я не знал о промежуточной оговорке. –

Смежные вопросы