减速机独立增量编号

时间:2014-07-22 08:48:21

标签: hadoop mapreduce hive

我正在尝试将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会将数据抛出Reducers,每个Reducers独立运行代码并为Call_No和Cumm_Call_No生成自己的值。由于日志的大小,相同CustID和/或AcctNo的行很可能会在Reducers中传播。

有人在处理这种情况时是否有任何理论或更好的解决方案?

此致

Capt'n

1 个答案:

答案 0 :(得分:0)

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

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