gpt4 book ai didi

join - Hive:解决非等左连接

转载 作者:行者123 更新时间:2023-12-05 00:41:38 24 4
gpt4 key购买 nike

Hive 不支持非对等连接:常见的解决方法是将连接条件移动到 where 子句,当您需要内部连接时,这可以正常工作。但是左连接呢?

人为的例子。假设我们有一个 orderLineItem 表,我们需要加入一个 ProductPrice 表,该表具有产品 ID、价格和价格适用的日期范围。我们想加入这个,其中 ProductID=ProductID & OrderDate 在开始和结束日期之间。如果 productID 或有效日期范围不匹配,我仍然希望查看所有 orderLineItem。

这个 SQL fiddle 是我们如何在 MSSQL 中执行此操作的示例:
http://sqlfiddle.com/#!6/fb877/7

问题
如果我应用典型的解决方法,并将 non equi 过滤器移动到 where 子句,它将成为内部联接。在上面的例子中,在 sql fiddle & 下面,我有一个不在查找中的产品 ID。

问题:
如果 hive 不支持非 eqi-joins,如何实现左非 eqi?

[SQLFiddle 内容]

表格:

CREATE TABLE OrderLineItem(
LineItemIDId int IDENTITY(1,1),
OrderID int NOT NULL,
ProductID int NOT NULL,
OrderDate Date
);


CREATE TABLE ProductPrice(
ProductID int,
Cost float,
startDate Date,
EndDate Date


);

加载数据以及我们如何加入 MSSQL:
--Old Price. Should be ignored
INSERT INTO ProductPrice(ProductID, COST,startDate,EndDate) VALUES (1, 50,'12/1/2012','1/1/2013');
INSERT INTO ProductPrice(ProductID, COST,startDate,EndDate) VALUES (2, 55,'12/1/2012','1/1/2013');

--Price for Order 2. Should be applied to Order 1
INSERT INTO ProductPrice (ProductID, COST,startDate,EndDate) VALUES(1, 20,'12/1/2013','1/1/2014');
INSERT INTO ProductPrice (ProductID, COST,startDate,EndDate) VALUES(2, 25,'12/1/2013','1/1/2014');

--Price for Order 2. Should be applied to Order 2
INSERT INTO ProductPrice (ProductID, COST,startDate,EndDate) VALUES(1, 15,'1/2/2014','3/1/2014');
INSERT INTO ProductPrice (ProductID, COST,startDate,EndDate) VALUES(2, 20,'1/2/2014','3/1/2014');


--January 1st 2014 Order
INSERT INTO OrderLineItem(OrderID,ProductID,OrderDate) VALUES (1, 1,'1/1/2014') ;
INSERT INTO OrderLineItem(OrderID,ProductID,OrderDate) VALUES (1, 2,'1/1/2014');

--Feb 1st 2014 Order
INSERT INTO OrderLineItem(OrderID,ProductID,OrderDate) VALUES (2, 1,'2/1/2014');
INSERT INTO OrderLineItem (OrderID,ProductID,OrderDate) VALUES(2, 2,'2/1/2014');
INSERT INTO OrderLineItem (OrderID,ProductID,OrderDate) VALUES(2, 3,'2/1/2014'); -- no price

SELECT * FROM OrderLineItem;

SELECT * FROM OrderLineItem li LEFT OUTER JOIN ProductPrice p on
p.ProductID=li.ProductID AND OrderDate BETWEEN startDate AND EndDate;

最佳答案

  • 使用添加的序列行号创建左表的副本:
    CREATE TABLE OrderLineItem_serial AS
    SELECT ROW_NUMBER() OVER() AS serial, * FROM OrderLineItem;

    备注:这对于某些表格格式可能更有效(必须没有压缩):
    CONCAT(INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE) AS serial
  • 做一个内连接:
    CREATE TABLE OrderLineItem_inner AS
    SELECT * FROM OrderLineItem_serial li JOIN ProductPrice p
    on p.ProductID = li.ProductID WHERE OrderDate BETWEEN startDate AND EndDate;
  • 按序列左连接:
    SELECT * FROM OrderLineItem_serial li
    LEFT OUTER JOIN OrderLineItem_inner i on li.serial = i.serial;
  • 关于join - Hive:解决非等左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23112355/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com