Hive:为每一行重复SELECT

时间:2014-10-29 23:39:57

标签: hive

我不完全确定这是一个很好的问题标题,但我会在身体中尽可能地解释。

我正在使用来自http://labrosa.ee.columbia.edu/millionsong/

的百万歌曲数据集

我的最终目标是按照“相似的歌曲”创作一些东西,我会根据年份,持续时间等来拍摄一首歌并获得相似的歌曲。

我将hive表中的数据设置为

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

我的问题是因为Hive不支持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;

但我不确定如何在每一行上运行此操作,同时采用适当的值而非硬编码2005 I.E。:

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

有没有人遇到过这样的情况,或者有任何我可以尝试的总体想法?

1 个答案:

答案 0 :(得分:1)

您可以在where子句中执行交叉连接和子集:

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

请记住,上面的内容也会与每首歌曲相匹配。如果需要,您需要另一个限制来删除这些记录。