hadoop - 使用子查询连接 HIVE 中的两个表

标签 hadoop hive hiveql

我需要在特定日期和时间获取某件商品的成本。我有这两张表:

create table sales ( product_id int, items_sold int, date_loaded date ); create table product ( product_id int, description string, item_cost double, date_loaded date );

产品表是每件商品的历史记录。如果今天一件商品的成本是 1.00 美元,而昨天该商品的成本是 0.99 美元,我将有两条记录,每天一条。当我加载我的销售数据时,我需要反射(reflect)该商品昨天的成本,而不是今天的成本。

这是我要执行的查询:

SELECT s.product_id, s.items_sold, p.description, s.items_sold * p.item_cost as total_cost FROM sales s, product p WHERE p.product_id = s.product_id and p.date_loaded <= ( SELECT MAX(pp.date_loaded) FROM product pp WHERE pp.product_id = s.product_id and pp.date_loaded <= s.date_loaded )

销售表:

|PRODUCT_ID |ITEMS_SOLD |DATE_LOADED | |1 |4 |2016-06-30 | |1 |5 |2016-07-01 | |1 |6 |2016-07-02 | |1 |3 |2016-07-03 |

产品表:

|PRODUCT_ID |DESCRIPTION |ITEM_COST |DATE_LOADED | |1 |ITEM A |0.99 |2016-06-20 | |1 |ITEM A |1.00 |2016-07-02 |

我希望看到这样的结果:

|PRODUCT_ID |ITEMS_SOLD |DESCRIPTION |ITEM_COST |TOTAL_COST | |1 |4 |ITEM A |0.99 |3.96 | |1 |5 |ITEM A |0.99 |4.95 | |1 |6 |ITEM A |1.00 |6.00 | |1 |3 |ITEM A |1.00 |3.00 |

从我读过的所有内容来看,这种形式的子查询是不允许的。那么我如何在 HIVE 中完成此操作?

最佳答案

可以用CTE来完成和 Lag widow function

     With result as(select PRODUCT_ID, DESCRIPTION, ITEM_COST , DATE_LOADED ,
     LEAD(DATE_LOADED, 1,'2999-01-01')
     OVER (ORDER BY DATE_LOADED) AS fromdate from PRODUCT ) 
     SELECT s.product_id, s.items_sold, p.description, s.items_sold * p.item_cost 
     as total_cost  FROM sales s join result p on s.product_id = p.product_id 
     where s.DATE_LOADED >= p.DATE_LOADED  and s.DATE_LOADED < p.fromdate  ;  

result

关于hadoop - 使用子查询连接 HIVE 中的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38362295/

相关文章:

hadoop - 无法有效映射 HIVe 表中的 HBase 行键

amazon-web-services - `EMR service role is invalid` 创建EMR集群时

csv - 远程机器上的 Hadoop/Hive : Loading data from . csv

mysql - 如何在sql中检索表中两列的最大值

java - 在 Hive 中创建、添加和使用 UDF

Hadoop-Hive |在 Hive 中将单行列转换为多行

hadoop - 如何让配置单元同时运行 mapreduce 作业?

hadoop - 在Apache Pig中创建时间序列

java - MapReduce 中的 N 轮减少

hadoop - 更改 dfs 文件的 block 大小