2012-07-01 9 views
10

Dies ist erste Tabelle in Hive-It enthält Informationen über den Artikel, den wir kaufen.Abfrage zwei verwandte Tabellen (Joins)

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 
) 

Und dies sind die Daten in der obigen ersten Tabelle

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

Dies ist zweite Tabelle in Hive- Es auch Informationen über die Elemente enthält, wir kaufen.

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

Und dies sind die Daten in der obigen Tabellen-

**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"}] 

ich die Daten nur auf eine BUYER_ID reduziert haben (BENUTZER_ID) das Problem einfach zu machen, zu verstehen.

Problem Anweisung-

Ich brauche die Table2 mit Table1, zu vergleichen, was bedeutet, dass ich, wenn USER_ID von Table2 und BUYER_ID von Table1 sehen müssen (da sie beide gleiche Sache sind) abgestimmt wird, dann PURCHASED_ITEM in Tabelle2, die ein Array von PRODUCT_ID (dasselbe wie ITEM_ID) und TIMESTAMPS (dasselbe wie CREATED_TIME) ist, sollte ITEM_ID und CREATED_TIME in Table1 für diese bestimmte USER_ID (BUYER_ID) sein und manchmal ist es auch möglich, dass sie (bedeutet PURCHASED_ITEM und ITEM_ID, CREATED_TIME) sind nicht gleich oder einige PRODUCT_ID und TIMESTAMPS fehlen von Table2 nach dem Vergleich von Table1.

Damit meine ich die Anzahl der PRODUCT_ID und TIMESTAMPS in Table2 sollte für diese bestimmte BUYER_ID (BENUTZER_ID) und der Inhalt sollte gleich sein wie Graf von ITEM_ID und CREATED_TIME in Tabelle 1 gleich sein. Wenn sie nicht gleich sind oder Eintrag von Table2 fehlt, dann muss ich das Ergebnis drucken, diese besondere ITEM_ID und CREATED_TIME fehlt Table2 oder die PRODUCT_ID und TIMESTAMPS sind nicht gleichen, nachdem sie von Table1 zu vergleichen.

So zum Beispiel in Tabelle 1 zur Zeit für diesen BUYER_ID 1015826235 Ich habe 5 ITEM_ID und 5 CREATED_TIME, so in Tabelle 2 sollte ich 5 PRODUCT_ID und 5 TIMESTAMPS genau gleich wie Tabelle 1 für gleiche USER_ID(BUYER_ID) in einer Reihe. Wenn es nicht dasselbe ist oder der Eintrag fehlt, muss ich das Ergebnis drucken, das anzeigt, dass es fehlt oder diese Daten falsch sind.

So einfach es in Table2 und es enthält zwei Dinge PRODUCT_ID und TIMESTAMPS

PURCHASED_ITEM ist ein Array von Struct mehr Klar- zu machen.

Wenn USER_ID und BUYER_ID wird dann abgestimmt PRODUCT_ID in Table2 sollte mit ITEM_ID in Table1 und TIMESTAMPS in Table2 sollte mit CREATED_TIME in Table1 abgestimmt werden abgestimmt werden.

AKTUALISIERT

HiveQL SQL Query Frage: -

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. 

Abfrage, die ich für die erste Frage geschrieben. Ist die Abfrage richtig?

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

All dieser kühne Text war ein wenig blendend. – Ben

Antwort

0

Ich bin mit Hive nicht vertraut, aber ich würde vorschlagen, dass Sie eine temporäre Tabelle mit demselben Schema wie Tabelle 1 erstellen, und füllen Sie es mit Table2 Daten (mit Zeitstempel-Konvertierung). Dies könnte eventuell eine Ansicht sein, wenn sie unterstützt wird.

den Inhalt von zwei Tabellen vergleichen, ist dann möglich, mit Fragen wie:

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

Danke für das Kommentieren. Aber das wird mit HiveQL nicht funktionieren, denke ich. :( – AKIWEB

1

Ich schlage vor, Sie nicht „string“ Datentyp für Ihre CREATED_TIME und Zeitstempel zu verwenden, da es schwieriger Vergleiche macht. Verwenden Sie stattdessen Date oder TimeStamp.

Und für Ihre Frage: Ich denke, das große Problem hier ist die Verwendung von Saiten allein!

Ich bin Oracle-Benutzer, aber es sollte in Hive so etwas wie dieses:

To_date({string},{Format}) 

wie Sie

UNIX_TIMESTAMP({string}) 

Eine andere Sache verwendet: Wenn Sie strucs haben, shouls Sie Felder wie diese Adresse : Table2.PURCHASED_ITEM [{address}]. Product_id und nicht Table2.product_id, die unbekannt ist.

und einen weiteren Vorschlag:

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

wenn Ihr CREATED_TIME und Ihre time_stamp sind nicht genau in der gleichen Zeit tickt (kann wegen der Differenz Einsatzzeit 0,001 Sekunden Differenz, wenn Sie jetzt oder sysdate einfügen für jede Sie schneiden das Datum besser auf Sekunden oder Millisekunden oder was immer Sie für besser halten.

Noch eine Sache: Verwenden Sie auch hier NVL() oder NULL-Werte konvertieren, weil, wenn Sie solche Probleme haben, auch NULL-Werte in Ihrer Tabelle vorhanden sein können, die Probleme in Ihren Abfragen verursachen, wird die NVL() -Funktion konvertieren null zu etwas, das du magst.

Hoffe, das hilft.