使用hiveudf函数计算sql运行和

ffdz8vbo  于 2021-06-04  发布在  Hadoop
关注(0)|答案(4)|浏览(399)

我是一个新手在Hive和想原谅我的无知事先为任何东西下面。我有一张table如下:

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;

显然,它不会产生上述输出,因为只有一个Map器,并且调用了同一个udf示例,该示例在整个集合上生成一个运行求和。我的目标是为每个storeid重置udf类中的runningsum示例变量,以便evaluate函数返回上述输出。我使用了以下方法:1。传递storeid变量rsum(sales,storeid),然后我们就可以在udf类中正确地处理这种情况。2在以下查询中使用2个Map器:

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总是出现在顶部?除了上述方法之外,我还想征求您对其他不同方法的建议,在这些方法中我可以实现相同的功能(例如子查询/联接)。另外,你建议的方法的时间复杂度是多少?

bweufnob

bweufnob1#

从表中选择storeid,smonth,sales,sum(sales)over(partition by storeid order by smonth)作为rsum;

gzszwxb4

gzszwxb42#

这应该可以做到:

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

ejk8hzay

ejk8hzay3#

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

我希望这能帮助你达到目标产量。

3vpjnl9f

3vpjnl9f4#

或者,您可以看看这个包含几个功能扩展的配置单元票证。
其中有一个累积和实现(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

相关问题