2012-07-01 13 views
10

Questa è la prima tabella in Hive: contiene informazioni sull'elemento che stiamo acquistando.Interroga due tabelle correlate (Join)

CREATE EXTERNAL TABLE IF NOT EXISTS Table1 (This is the MAIN table through which comparisons need to be made) 
(
ITEM_ID BIGINT, 
CREATED_TIME STRING, 
BUYER_ID BIGINT 
) 

e questo è i dati nella tabella di cui sopra prima

**ITEM_ID** **CREATED_TIME** **BUYER_ID** 
220003038067  2012-06-21  1015826235 
300003861266  2012-06-21  1015826235 
140002997245  2012-06-14  1015826235 
200002448035  2012-06-08  1015826235 
260003553381  2012-06-07  1015826235 

Questa è la seconda tavola in Hive- Esso contiene inoltre informazioni sugli elementi che stanno acquistando.

CREATE EXTERNAL TABLE IF NOT EXISTS Table2 
(
USER_ID BIGINT, 
PURCHASED_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>> 
) 

e questo è il dati del tavolo- sopra

**USER_ID** **PURCHASED_ITEM** 
1015826235  [{"product_id":220003038067,"timestamps":"1340321132000"}, {"product_id":300003861266,"timestamps":"1340271857000"}, {"product_id":140002997245,"timestamps":"1339694926000"}, {"product_id":200002448035,"timestamps":"1339172659000"}, {"product_id":260003553381,"timestamps":"1339072514000"}] 

ho ridotto i dati a un solo buyer_id (USER_ID) per rendere il problema semplice da capire.

Problema Statement-

ho bisogno di confrontare il Table2 con Table1, il che significa che ho bisogno di vedere se USER_ID da Table2 e BUYER_ID da Table1 (in quanto entrambi sono stessa cosa) viene abbinato, quindi PURCHASED_ITEM in Tabella2 che è una matrice di PRODUCT_ID (uguale a ITEM_ID) e TIMESTAMPS (uguale a CREATED_TIME) dovrebbe essere uguale a ITEM_ID e CREATED_TIME in Table1 per quel particolare USER_ID (ACQUIRENTE) e talvolta è possibile che siano (significa PURCHASED_ITEM e ITEM_ID, CREATED_TIME) non sono uguali o alcuni PRODUCT_ID e TIMESTAMPS mancano da Table2 dopo il confronto da Table1.

Con ciò significa che il conteggio di PRODUCT_ID e TIMESTAMPS in Table2 dovrebbe essere lo stesso valore di ITEM_ID e CREATED_TIME in Tabella 1 per quel particolare buyer_id (USER_ID) e il contenuto deve essere lo stesso. Se non sono gli stessi e il vincolo non è presente Table2, poi ho bisogno di stampare il risultato, questa particolare ITEM_ID e CREATED_TIME manca dal Table2 o PRODUCT_ID e TIMESTAMPS non sono lo stesso dopo aver confrontato da Table1.

Così, per esempio in Tabella 1 attualmente per questo BUYER_ID 1015826235 ho 5 ITEM_ID e 5 CREATED_TIME, così in Table2 devo avere 5 PRODUCT_ID e 5 TIMESTAMPS esattamente come Table1 per lo stesso USER_ID(BUYER_ID) in una riga. Se non è lo stesso o manca la voce, devo stampare il risultato mostrando che questo è mancante o questo dato è sbagliato.

Quindi, solo per renderlo più Clear-

PURCHASED_ITEM è un array di Struct in Table2 e contiene due cose PRODUCT_ID e TIMESTAMPS.

Se USER_ID e BUYER_ID ottiene abbinati poi PRODUCT_ID in Table2 dovrebbe essere abbinato con ITEM_ID in Table1 e TIMESTAMPS in Table2 dovrebbe essere abbinato con CREATED_TIME in Table1.

AGGIORNATO

HiveQL SQL Query Domanda: -

Q 1) Find all USER_ID from Table2 whose PRODUCT_ID or TIMESTAMP are not same with 
ITEM_ID or CREATED_TIME after comparing with Table1 on BUYER_ID. 

query che ho scritto per la prima domanda. La domanda è giusta?

A 1) select Table2.user_id from Table2 where Table1.user_id = Table2.buyer_id 
and (Table1.item_id <> Table2.product_id or UNIX_TIMESTAMP(Table1.created_time) <> 
Table2.timestamps) 


Q 2) Find the `BUYER_ID(USER_ID)` and as well as those `ITEM_ID` and `CREATED_TIME` 
which are missing from `Table2` after comparing from `Table1` on `BUYER_ID`. 

A 2) Not sure. 
+0

Tutto quel testo in grassetto era un po 'accecante. – Ben

risposta

0

io non sono a conoscenza Hive, ma io suggerirei che si crea una tabella temporanea con lo stesso schema come Table1, e riempirlo con i dati Table2 (con la conversione timestamp). Questo potrebbe alla fine essere una vista, se supportato.

Confrontando il contenuto di due tavoli è quindi possibile con le query come ad esempio:

SELECT * FROM Table1 WHERE (ITEM_ID,CREATED_TIME,BUYER_ID) NOT IN (SELECT * FROM Table2bis) 

SELECT * FROM Table2bis WHERE (ITEM_ID,CREATED_TIME,BUYER_ID) NOT IN (SELECT * FROM Table1) 
+0

Grazie per il commento. Ma questo non funzionerà con HiveQL, immagino. :( – AKIWEB

1

vi consiglio di non usare il tipo di dati "stringa" per il vostro CREATED_TIME e timestamp perché rende i confronti Harder. Invece di usare Date o TimeStamp.

E per la tua domanda: Penso che il grosso problema qui stia usando le stringhe da solo!

Sono utente di Oracle, ma ci dovrebbe essere qualcosa di simile in Hive:

To_date({string},{Format}) 

come si è utilizzato

UNIX_TIMESTAMP({string}) 

Un'altra cosa: quando si ha strucs, si shouls affrontare campi come questo : Table2.PURCHASED_ITEM [{indirizzo}]. Product_id e non Table2.product_id che è sconosciuto.

e uno più suggerimento:

Trunc({Date},{Format ex: 'SS' for sseconds}) 

quando il CREATED_TIME e la tua time_stamp non sono esattamente nello stesso tempo le zecche (potrebbero essere 0.001 secondi differenza a causa della differenza di tempo di inserimento se si inserisce ora o sysdate per ciascuno di loro) è meglio troncare la data in secondi o Milli-secondi o qualunque cosa tu pensi sia meglio.

Un'altra cosa: usa NVL() o Converti anche valori null qui, perché se hai questi problemi è anche possibile avere valori nulli nella tabella che causano problemi nelle tue query, la funzione NVL() convertirà null a qualcosa che ti piace.

Spero che questo aiuti.

Problemi correlati