2014-07-22 53 views
0

我想将一个SAS程序移植到Hive中,虽然我知道这不是理想的方式,但我时间紧迫,现在恐怕不得不忍受这种情况。下面减速器独立增量编号

这SAS代码是什么我遇到了麻烦:

if first.CustNo then do; 
Call_No=0; 
Call_No+1; 
Cumm_Call_No+1; 
Acct_Switch = 0; 
end; 

if first.AcctNo then do; 
Acct_Switch +1; 
Call_ID=0; 
Call_ID+1; 
if Acct_Switch >1 then do; 
Call_Diff=INTCK('second',PrevEnd,NewEnd); 
if Call_Diff >1800 then do; 
Call_No+1; 
Cumm_Call_No+1; 
end; 
end; 
end; 

Call_Diff=INTCK('second',PrevEnd,NewEnd); 
if Call_Diff >1800 then Call_ID+1; 
PrevEnd=0; 
PrevEnd+NewEnd; 
end; 

上面的代码是遍历一个日志文件,并吐出输出基础业务逻辑宏的一部分。

问题在于分配了Call_No和Cumm_Call_No变量。逻辑上说,一旦时间差超过30分钟,代码会将这些变量增加1,并将输出转储到新行中,即使CustID和AcctNo保持不变。

但是,我需要帮助,因为Hive会将数据跨越Reducer,每个独立运行代码并为Call_No和Cumm_Call_No生成它们自己的值。由于日志的大小,相同CustID和/或AcctNo的行很可能会跨越Reducers分布。

有人有任何理论或更好的处理这种情况下的任何解决方案吗?

问候

Capt'n

回答

0

这取决于您的查询。如果您在CustID和AcctNo上使用group by子句,则对应于相同CustID和AcctNo的所有行将转到同一个缩减器。这是有保证的。

对于计数器,您可以使用UDAF来实现该功能。