我是 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;
显然,它不会产生上述输出,因为只有一个映射器并且调用了相同的 udf 实例,它会在总集上生成一个运行总和。我的目标是为每个 storeid 重置 udf 类中的 runningSum 实例变量,以便评估函数返回上述输出。我使用了以下方法: 1. 传递 storeid 变量 rsum(sales, storeid) 然后我们可以在 udf 类中正确处理这种情况。2. 使用 2 个映射器,如下查询:
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 总是出现在顶部?除了上述方法之外,我想就其他不同的方法(例如子查询/连接)寻求您的建议。此外,您建议的方法的时间复杂度是多少?