sql - 使用配置单元 udf 函数计算运行总和

标签 sql hadoop hive

我是 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总是出现在最前面? 除了上述方法之外,我想就我可以实现相同目的的其他不同方法(例如子查询/连接)寻求您的建议。另外,您建议的方法的时间复杂度是多少?

最佳答案

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

我希望这可以帮助您获得目标输出。

关于sql - 使用配置单元 udf 函数计算运行总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14572519/

相关文章:

单个查询中的 MySQL 加权平均值

运行 h2o、rsparkling、sparklyr

pig 的 REGEX_EXTRACT 不起作用

hadoop - 每个映射器执行的任务

java.io.IOException : No LZO codec found, 无法运行

sql - 检查外键约束 "online"

sql - Pset7 - 电影卡在 12 和 13 SQL 上?

mysql - rails 3 : How to find records with field possibly equals to nil?

apache-spark - 将数据从 CSV 文件映射到 HDFS 上的 Hive 表时出错

python - 将 CSV 的唯一第 0 个元素分组为 python 或 hive 中唯一的第 i 个元素