想象一下,我有带有连续事件的 Hive 表 T:
n
---
1
2
3
4
...
我需要编写一些代码来从该表中选择每一对连续事件。目前我有一个解决方案
select t1.n, min(t2.n) from t t1 join t t2 where t1.n < t2.n group by t1.n;
即使对于相对较小的表(数千行),这也非常无效,因为它会在自身上产生表的临时笛卡尔积(即复杂性 O(n^2))。
我想为同一问题找到更便宜(希望是线性)的解决方案。
想象一下,我有带有连续事件的 Hive 表 T:
n
---
1
2
3
4
...
我需要编写一些代码来从该表中选择每一对连续事件。目前我有一个解决方案
select t1.n, min(t2.n) from t t1 join t t2 where t1.n < t2.n group by t1.n;
即使对于相对较小的表(数千行),这也非常无效,因为它会在自身上产生表的临时笛卡尔积(即复杂性 O(n^2))。
我想为同一问题找到更便宜(希望是线性)的解决方案。
在 0.11 之前,您可以使用 UDF(例如Nexr's)
目前只有一个lag
功能,但如果您要查询,应该在您的情况下这样做:
select n as "next" , lag(n) "previous" from t;
让我自己回答。
从 Hive 0.11 开始,引入了窗口和分析功能: https ://cwiki.apache.org/Hive/languagemanual-windowingandanalytics.html
所以我正在寻找的查询是:
select n, lead(n) from t;