我是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实例变量,以便evaluate函数返回上面的输出。 我使用了以下内容: 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始终出现在顶部? 我想就除了上述方法之外我可以实现相同的其他方法(例如子查询/连接)寻求你的建议。此外,您建议的方法的时间复杂性是什么?
答案 0 :(得分:9)
Hive提供了一种更好的方法来实现这一目标 -
请按照以下流程实现目标输出
创建一个可以包含数据集的hive表 -
1001 1 35000.0
1002 2 35000.0
1001 2 25000.0
1002 3 110000.0
1001 3 40000.0
1002 1 40000.0
现在只需在您的配置终端中运行以下命令 -
SELECT storeid, smonth, sales, SUM(sales) OVER (PARTITION BY storeid ORDER BY smonth) FROM table_name;
输出类似于 -
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
我希望这可以帮助您获得目标输出。
答案 1 :(得分:4)
或者,您可以查看包含多个功能扩展的this Hive票证 其中有一个累积和实现( GenericUDFSum )。
这个函数(简称“rsum”)有两个参数,id的哈希值(记录在reducers之间分配)和它们对应的值要求总结:
select t.storeid, t.smonth, t.sales, rsum(hash(t.storeid),t.sales) as sales_sum
from (select storeid, smonth, sales from sm distribute by hash(storeid)
sort by storeid, smonth) t;
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
答案 2 :(得分:0)
选择storeid,smonth,销售额,总和(销售额)(按storeid顺序按smonth划分)作为rsum FROM表;
答案 3 :(得分:0)
这应该可以解决问题:
SELECT
a.storeid,
a.smonth,
a.sales,
SUM(a.sales)
OVER (
PARTITION BY a.storeid
ORDER BY a.smonth asc
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM
table a;
src:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics