2012-07-08 155 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。