2012-07-08 14 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; 

Utilizzando la query precedente, ottengo l'output di seguito.SQL Query JOIN con tabella

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

Se si confronta il sopra output from the query with the below Table2 data, poi il product_id nel last line of above output non corrisponde con la ITEM_ID nell'ultima riga nei dati sottostanti 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 

Quindi la mia domanda è

Trova tutti coloro PRODUCT_ID(ITEM_ID) e TIMESTAMPS(CREATED_TIME) che non sono corrispondenti con i dati Table2 corrispondenti a particolari buyer_id o USER_ID.

Così ho bisogno di mostrare il risultato come questo per l'esempio- sopra

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

ho bisogno di unirsi alla query precedente che ho scritto con table2 per ottenere il risultato di cui sopra. Quindi ho bisogno di usare la mia query sopra nel processo di JOINING. Questo mi confonde molto. Ogni suggerimento sarà apprezzato.

UPDATE: -

ho scritto la domanda sotto, ma in qualche modo io non sono in grado di raggiungere l'uscita che volevo ottenere. Qualcuno mi può aiutare con questo?

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

Sto lavorando con Hive, e Hive supporta la sintassi di SQL così questa è la ragione per cui taggato questa domanda come 'sql' e' join'. Quindi JOIN funzionerà in HIVE. Ho solo bisogno di unirsi fondamentalmente. Quindi penso che la sintassi di Oracle andrà bene. – ferhan

+0

Perché l'ultima riga non corrisponde? È a causa del timestamp che non corrisponde al tempo creato? – dash

+0

Non sono sicuro che la query effettiva che ho scritto sia corretta o meno. Questo mi confonde molto. Quindi non sono sicuro che la query sopra sia corretta o meno. – ferhan

risposta

2

Penso che tu possa fare quello che vuoi con due domande, ma non ne sono sicuro al 100%. Spesso in questa situazione, è sufficiente trovare le cose nella prima tabella che non corrispondono nella seconda tabella. Stai anche cercando di ottenere una corrispondenza "più vicina", motivo per cui questa è una sfida.

La seguente query cerca partite su user id ed esattamente uno degli altri due campi, e poi li unisce:

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) 

Questo non troverà situazioni in cui non v'è alcuna corrispondenza in entrambi i campi.

Inoltre, l'ho scritto usando la sintassi "on" anziché "where". Presumo che HIVE supporti questo.

1

Il tuo rappresentante è troppo alto per aprire un duplicato e in particolare 2 duplicati della stessa domanda.

Joining two Tables in Hive using HiveQL(Hadoop)

Join Two Tables and get the output from both of them

Non hai abbastanza informazioni per legare i record torna per il terzo scenario.
È possibile eseguire FULL OUTER JOIN con un OR e recuperare tutto, abbinare le righe su cui si hanno informazioni sufficienti come nel primo e nel secondo caso in cui si elencano e identificare i registri non restituendo righe con valori null per i campi dalla tabella non corrispondente nel terzo scenario.

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) 

cercando di abbinare al terzo scenario è un hack - informazioni non c'è

Ciò li abbinare con qualsiasi per la data specificata non sono corrispondenti negli altri giorni, ma di nuovo otterrai prodotti cartesiani.

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) 
        ) 
    ) 

) 

Si potrebbe utilizzare RANK() o provare un top one, ecc RANK() o ROW_NO sarebbe probabilmente il migliore di questi hack se questo non fosse una domanda alveare, ma che ne so si sta usando HQL, non ho intenzione per scriverlo. Potresti estrarli in una tabella separata ed eseguire alcune query di aggiornamento logiche per aggiornarlo, quindi utilizzarlo come tabella di ricerca da legare.

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

Ciò che probabilmente si dovrebbe fare è quello che la persona in questione ti ha offerto una taglia sulla suggerito - dal momento che davvero non hanno un buon modo per interrogare il terzo scenario e avete offerto un'alternativa che è specifico per HIVE.