我是Hive的新手,在这里提前为以下内容中可能的愚蠢问题道歉。我有一张如下的表:
SELECT a.storeid, a.smonth, a.sales FROM table a;
1001 1 35000.0
1002 2 35000.0
1001 2 25000.0
1002 3 110000.0
1001 3 40000.0
1002 1 40000.0
我的目标输出如下:
1001 1 35000.0 35000.0
1001 2 25000.0 60000.0
1001 3 40000.0 100000.0
1002 1 40000.0 40000.0
1002 2 35000.0 75000.0
1002 3 110000.0 185000.0
我编写了一个简单的Hive UDF Sum类来实现上述功能,并在查询中使用了SORT BY storeid,smonth:
SELECT a.storeid, a.smonth, a.sales, rsum(sales)
FROM (SELECT * FROM table SORT BY storeid, smonth) a;
显然,它不会生成上面的输出,因为只有一个mapper,并且调用相同的UDF实例,它对整个集合生成一个运行总和。我的目标是在每个storeid中重置udf类中的runningSum实例变量,这样evaluate函数将返回上述输出。 我使用了以下方法: 1. 传递storeid变量rsum(sales,storeid),然后我们可以在UDF类中正确处理该情况。 2. 使用两个mappers,如下所示查询:
set mapred.reduce.tasks=2;
SELECT a.storeid, a.smonth, a.sales, rsum(sales)
FROM (SELECT * FROM table DISTRIBUTE BY storeid SORT BY storeid, smonth) a;
1002 1 40000.0 40000.0
1002 2 35000.0 75000.0
1002 3 110000.0 185000.0
1001 1 35000.0 35000.0
1001 2 25000.0 60000.0
1001 3 40000.0 100000.0
为什么总是在顶部出现1002? 除了以上的方法,我想寻求您对其他实现相同功能的不同方法(如子查询/连接)的建议。另外,您提出的方法的时间复杂度是多少?