我有一个订阅表如下所示。 大约有100万个唯一ID。 该表列出了当用户开始订阅服务时的订阅状态,如' Sub'当它取消订阅时,如'Usub'
ID Year Month Status
A 2014 1
A 2014 2
A 2014 3
A 2014 4 Sub
A 2014 5
A 2014 6
A 2014 7
A 2014 8 Usub
A 2014 9
A 2014 10
A 2014 11
A 2014 12
B 2014 1
B 2014 2
B 2014 3
B 2014 4
B 2014 5 Usub
B 2014 6
B 2014 7
B 2014 8
B 2014 9 Sub
B 2014 10
B 2014 11
B 2014 12
. . . .
. . . .
. . . .
我希望填补每个状态更新之间的差距。 所需的输出表如下所示:
ID Year Month Status
A 2014 1 Usub
A 2014 2 Usub
A 2014 3 Usub
A 2014 4 Sub
A 2014 5 Sub
A 2014 6 Sub
A 2014 7 Sub
A 2014 8 Usub
A 2014 9 Usub
A 2014 10 Usub
A 2014 11 Usub
A 2014 12 Usub
B 2014 1 Sub
B 2014 2 Sub
B 2014 3 Sub
B 2014 4 Sub
B 2014 5 Usub
B 2014 6 Usub
B 2014 7 Usub
B 2014 8 Usub
B 2014 9 Sub
B 2014 10 Sub
B 2014 11 Sub
B 2014 12 Sub
. . . .
. . . .
. . . .
虽然第一个表显示两个用户都有多个状态更改,但任何给定ID都不一定有多个状态更改。但是,每个ID至少有一个状态。即。在2014/8订阅并且从未取消订阅的用户将在2014/8上拥有status = Sub。
答案 0 :(得分:0)
您可以使用程序代码执行此操作,按顺序读取数据,并使用变量存储上一条记录的“状态”(在每个新ID上重置)。但是,SQL 不是程序。
那么我们可以为标准的单节点数据库(例如MySQL)和分布式系统(例如Hive)获得什么样的程序包装?
TRANSFORM
子句(Hive traduction of the传统和名称不佳的“Hadoop流媒体”功能);不幸的是the documentation is cryptic (你最好得到一本好老书,例如O'Reilly的“Programming Hive”)当你终于可以使它工作时,那么性能下降很重要< / LI>
现在,您需要在自定义查询和自定义代码中实现什么样的程序逻辑?
TRANSFORM
或Hive UDF,您还需要DISTRIBUTE BY键,以便每个键在单个节点中整体处理其历史记录(否则结果绝对不会感觉!)的