在列本身和日期确定的列中填写缺失值

时间:2016-07-21 18:17:10

标签: mysql hive

我有一个订阅表如下所示。 大约有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。

1 个答案:

答案 0 :(得分:0)

您可以使用程序代码执行此操作,按顺序读取数据,并使用变量存储上一条记录的“状态”(在每个新ID上重置)。但是,SQL 不是程序。

那么我们可以为标准的单节点数据库(例如MySQL)和分布式系统(例如Hive)获得什么样的程序包装

  • MySQL有一种支持游标的存储过程语言 迭代来自SELECT查询的行(Google将为您提供大量的随机获取的this one教程)
  • Hive 2.0也有一种procedural language extension,但它是 不是Hive本身的一部分 - 你必须在一个程序中运行你的程序脚本 specific tool(并不是每个人都有Hive 2.0) - 另外,Hive在分布式文件系统上运行分布式查询,因此“改组”单个客户端节点上的所有行,然后使用单线程工具进行迭代听起来非常笨拙 - 自担风险调查
  • Hive还有一种复杂而繁琐的方法,以以分布式方式运行任意程序代码(在每个Mapper或每个Reducer中),使用TRANSFORM子句(Hive traduction of the传统和名称不佳的“Hadoop流媒体”功能);不幸的是the documentation is cryptic (你最好得到一本好老书,例如O'Reilly的“Programming Hive”)当你终于可以使它工作时,那么性能下降很重要< / LI>
  • 或者,您可以开发一个Java中的自定义Hive UDF ,稍微扭曲一下 - 即将前一行中的状态存储在Java变量中并使用它 对于当前行

现在,您需要在自定义查询和自定义代码中实现什么样的程序逻辑

  • 首先,您需要输入查询到SORT BY键,日期
  • 使用Hive TRANSFORM或Hive UDF,您还需要DISTRIBUTE BY键,以便每个键在单个节点中整体处理其历史记录(否则结果绝对不会感觉!)
  • 为“PreviousRowKey”和“PreviousRowState”
  • 定义2个变量
  • 在第1行,或更改Key,然后“PreviousRowState = Usub”和“PreviousRowKey = currentKey”
  • 关于状态的改变然后“PreviousRowState = currentState”否则强制“currentState = PreviousRowState”