2012-07-08 153 views
5
select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as 
timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table 
as prod_and_ts; 

通过使用上述查询,我​​得到了下面的输出。SQL查询连接表

USER_ID  | PRODUCT_ID | TIMESTAMPS 
------------+------------------+------------- 
1015826235  220003038067  1004841621 
1015826235  300003861266  1005268799 
1015826235  140002997245  1061569397 
1015826235  *200002448035*  1005542471 

如果你比较上述output from the query with the below Table2 data,然后在last line of above outputproduct_id不与ITEM_ID最后一行在下面Table2数据进行匹配。

BUYER_ID  | ITEM_ID  |  CREATED_TIME 
-------------+-------------------+------------------------ 
1015826235  220003038067  2001-11-03 19:40:21 
1015826235  300003861266  2001-11-08 18:19:59 
1015826235  140002997245  2003-08-22 09:23:17 
1015826235  *210002448035*  2001-11-11 22:21:11 

所以我的问题是

找到所有这些PRODUCT_ID(ITEM_ID)TIMESTAMPS(CREATED_TIME)不与对应于特定BUYER_ID或USER_ID Table2数据匹配。

所以我需要证明这样的结果对于上述示例 -

BUYER_ID |  ITEM_ID  |  CREATED_TIME  |  USER_ID |  PRODUCT_ID  | TIMESTAMPS 
-----------+-------------------+-------------------------+---------------+------------------+------------------ 
1015826235  *210002448035*  2001-11-11 22:21:11  1015826235  *200002448035*  1005542471 

我需要加入我与表2中写道,以获得上述结果上面的查询。所以我需要在JOINING过程中使用我的上述查询。这让我很困惑。任何建议将不胜感激。

更新: -

我写了下面的查询,但不知何故,我无法做到这一点,我想实现输出。谁能帮我这个?

SELECT table2.buyer_id, table2.item_id, table2.created_time from 
(select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as 
timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table 
as prod_and_ts) prod_and_ts JOIN table2 where 
prod_and_ts.user_id = table2.buyer_id 
and (product_id <> table2.item_id or 
timestamps <> UNIX_TIMESTAMP(table2.created_time)); 
+1

我正在使用Hive,Hive支持SQL语法,所以这就是我将这个问题标记为'sql'和'join'的原因。所以JOIN将在HIVE中工作。我只需要加入基本。所以我认为Oracle语法会很好。 – ferhan 2012-07-08 20:37:08

+0

为什么最后一行不匹配?是否因为时间戳与创建的时间不匹配? – dash 2012-07-08 23:03:57

+0

我不确定我写的实际查询是否正确。这让我很困惑。所以不确定上面的查询是否正确。 – ferhan 2012-07-08 23:06:37

回答

2

我认为你可以用两个查询来做你想要的,但我不是100%确定的。通常在这种情况下,在第一个表中找到与第二个表中不匹配的东西就足够了。你也试图得到一个“最接近”的比赛,这就是为什么这是具有挑战性的。

以下查询查找用户ID比赛和其他两个领域的只有一个,然后将它们组合:

SELECT table2.buyer_id, table2.item_id, table2.created_time, prod_and_ts.* 
from (select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as timestamps 
     from testingtable2 LATERAL VIEW 
      explode(purchased_item) exploded_table as prod_and_ts 
    ) prod_and_ts JOIN 
    table2 
    on prod_and_ts.user_id = table2.buyer_id and 
     prod_and_ts.product_id = table2.item_id and 
     prod_and_ts.timestamps <> UNIX_TIMESTAMP(table2.created_time) 
union all 
SELECT table2.buyer_id, table2.item_id, table2.created_time, prod_and_ts.* 
from (select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as timestamps 
     from testingtable2 LATERAL VIEW 
      explode(purchased_item) exploded_table as prod_and_ts 
    ) prod_and_ts JOIN 
    table2 
    on prod_and_ts.user_id = table2.buyer_id and 
     prod_and_ts.product_id <> table2.item_id and 
     prod_and_ts.timestamps = UNIX_TIMESTAMP(table2.created_time) 

这不会发现那里是在任场不匹配的情况。

此外,我用“on”语法而不是“where”写了这个。我认为HIVE支持这一点。

1

您的代表太高,无法打开重复的,尤其是同一问题的两个副本。

Joining two Tables in Hive using HiveQL(Hadoop)

Join Two Tables and get the output from both of them

您没有足够的信息,以配合记录回第三种情况。
你可以用OR做一个FULL OUTER JOIN,然后把所有的东西都回来,匹配你有足够的信息的行,就像你列出的第一个和第二个情况一样,并且通过返回字段来自第三种情况下的不匹配表。

SELECT DATEPART(d,B.T1time),DATEPART(d,A.Created_TIME),* 
FROM SO_Table1HIVE A 
FULL OUTER JOIN SO_Table2HIVE B ON A.BUYER_ID = B.[USER_ID] 
AND (B.t1time = A.Created_TIME OR B.PRODUCTID = A.ITEM_ID) 

,尝试匹配的第三个场景是一个黑客 - 的信息不存在

这将任何对于未在其他日子匹配指定的日期与它们匹配,但再次你会得到笛卡尔产品。

SELECT DATEPART(d,B.T1time),DATEPART(d,A.Created_TIME),* 
FROM SO_Table1HIVE A 
FULL OUTER JOIN SO_Table2HIVE B ON A.BUYER_ID = B.[USER_ID] 
AND (
    (B.t1time = A.Created_TIME OR B.PRODUCTID = A.ITEM_ID) 
    OR 
    (
     (A.Created_TIME <> B.t1time AND B.PRODUCTID <> A.ITEM_ID AND DATEPART(d,B.T1time) = DATEPART(d,A.Created_TIME)) 
     AND a.ITEM_ID NOT IN(SELECT ITEM_ID 
        FROM SO_Table1HIVE A2 
        INNER JOIN SO_Table2HIVE B2 ON A2.BUYER_ID = B2.[USER_ID] AND (A2.Created_TIME = B2.t1time OR B2.PRODUCTID = A2.ITEM_ID) 
        ) 

     AND B.PRODUCTID NOT IN(SELECT PRODUCTID 
        FROM SO_Table1HIVE A2 
        INNER JOIN SO_Table2HIVE B2 ON A2.BUYER_ID = B2.[USER_ID] AND (A2.Created_TIME = B2.t1time OR B2.PRODUCTID = A2.ITEM_ID) 
        ) 
    ) 

) 

你可以使用RANK()或尝试top oneRANK()ROW_NO很可能是最好的,这些黑客的,如果这是不是一个蜂巢的问题,但我知道你正在使用HQL,我不打算把它写出来。您可以将它们放在单独的表中并运行一些逻辑更新查询来更新它,然后将其用作查找表来进行绑定。

tbl1Tbl2Lookup 
--------------- 
id int identity 
table1info FK 
table2info FK 

什么,你可能应该做的是什么样的人在这个问题上,你提供的赏金建议 - 因为你真的没有查询第三种情况的好办法,他们给你提供了一个替代方案,是特定的HIVE。