Sql 使用配置单元udf函数计算运行和
我是一个蜂巢里的新手,我想先原谅我对下面任何东西的无知。我的表格如下:Sql 使用配置单元udf函数计算运行和,sql,hadoop,hive,Sql,Hadoop,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 35
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
我的目标产出如下:
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实例,该实例在整个集合上生成一个运行总和。我的目标是在udf类中为每个storeid重置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总是出现在顶部?
除了上述方法外,我还想征求您对其他不同方法的建议,在这些方法中我可以实现相同的功能(例如子查询/联接)。另外,您建议的方法的时间复杂性是什么?或者,您可以查看包含多个功能扩展的Hive ticket。
除此之外,还有一个累积和实现(GenericUDFSum) 此函数(称为“rsum”)接受两个参数,即id的哈希值(通过该哈希值,记录在还原器之间进行分区)及其要求和的相应值:
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
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
我希望这可以帮助您获得目标输出。选择storeid、smonth、sales、sum(sales)over(按storeid分区,按smonth排序)作为rsum
从表中 这应该可以做到:
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: