2012-07-01 17 views
10

To jest pierwsza tabela w Ulu - Zawiera informacje o przedmiocie, który kupujemy.Zapytanie o dwie powiązane tabele (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 
) 

A to dane zawarte w powyższej tabeli pierwszej

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

Jest to druga tabela w Hive- zawiera również informacje o rzeczach zakupu.

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

A to dane zawarte w powyższej Tabeli-

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

mam zmniejszone dane tylko do jednego BUYER_ID (user_id) uczynienia problem prosty do zrozumienia.

Problem Instrukcja-

muszę porównywać Table2 z Table1, co oznacza, muszę zobaczyć, czy USER_ID z Table2 i BUYER_ID od Table1 (jak oboje są samo) zostanie dopasowane, a następnie w PURCHASED_ITEM Tabela 2, która jest tablicą identyfikatorów PRODUCT_ID (takich samych jak ITEM_ID) i TIMESTAMPS (taka sama jak CREATED_TIME) powinna być taka sama jak ITEM_ID i CREATED_TIME w tym konkretnym identyfikatorze USER_ID (KUPUJĄCY_ID), a także czasami jest możliwe, że one (oznacza PURCHASED_ITEM i ITEM_ID, CREATED_TIME) nie są takie same lub niektóre PRODUCT_ID i TIMESTAMPS brakuje w Table2 po porównaniu z Table1.

Przez to mam na myśli liczbę PRODUCT_ID i TIMESTAMPS w Table2 powinien być taki sam jak zliczania ITEM_ID i CREATED_TIME w Tabela1 dla tego konkretnego BUYER_ID (user_id), a treść powinna być taka sama. Jeśli nie są one takie same lub brakuje wpisu z Table2, to muszę wydrukować wynik, ten konkretny ITEM_ID i CREATED_TIME brakuje w Table2 lub PRODUCT_ID i TIMESTAMPS nie są takie same po porównaniu z Table1.

Tak na przykład w tabeli 1. Obecnie dla tego BUYER_ID 1015826235 mam 5 ITEM_ID i 5 CREATED_TIME, więc w Table2 miałbym 5 PRODUCT_ID i 5 TIMESTAMPS dokładnie takie same, jak dla samego USER_ID(BUYER_ID) Table1 w jednym rzędzie. Jeśli nie jest to samo lub brakuje wpisu, muszę wydrukować wynik, który pokazuje, że tego brakuje lub te dane są błędne.

Więc po prostu aby uczynić go bardziej swoim funkcjonalnym

PURCHASED_ITEM jest tablicą Struct w Table2 i zawiera dwie rzeczy PRODUCT_ID i TIMESTAMPS.

Jeśli USER_ID i BUYER_ID zostanie spełniony to PRODUCT_ID w Table2 powinny być dopasowane ITEM_ID w Table1 i TIMESTAMPS w Table2 powinny być dopasowane CREATED_TIME w Table1.

AKTUALIZACJA

HiveQL zapytań SQL Pytanie: -

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. 

zapytań, które napisałem na pierwsze pytanie. Czy zapytanie jest prawidłowe?

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

Cały ten odważny tekst był trochę oślepiający. – Ben

Odpowiedz

0

nie jestem zaznajomiony z ula, ale sugeruję, że należy utworzyć tabelę tymczasową z tego samego schematu jak Table1 i wypełnić ją danymi Table2 (z konwersją datownika). Może to być widok, jeśli jest obsługiwany.

Porównując zawartość dwóch tabel jest wtedy możliwe zapytań takich jak:

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

Dzięki za komentowanie. Ale nie będzie to działać z HiveQL. :( – AKIWEB

1

proponuję nie używać „string” typ danych dla CREATED_TIME i datownik, ponieważ sprawia porównań Harder. Zamiast tego użyj Date lub TimeStamp.

I na twoje pytanie: Myślę, że dużym problemem tutaj jest używanie samych ciągów!

Jestem użytkownika oracle, ale nie powinno być coś takiego w Ulu:

To_date({string},{Format}) 

jak kiedyś

UNIX_TIMESTAMP({string}) 

Kolejna rzecz: gdy masz strucs, shouls adresowania pól jak to : Table2.PURCHASED_ITEM [{address}] .ID produktu, a nie Table2.product_id, który jest nieznany.

i jeszcze jedna sugestia:

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

gdy CREATED_TIME a datownik nie są dokładnie w tym samym czasie kleszcze (może być 0.001 sekund różnicy ze względu na różnicę czasu wkładki jeśli włożysz Teraz albo sysdate dla każdego im) lepiej obciąć datę do sekund lub Milli sekund lub cokolwiek, co uważasz za lepsze.

Jeszcze jedno: użyj tutaj NVL() lub Konwertuj wartości null, ponieważ jeśli masz takie problemy, możliwe jest również, że masz w tabeli wartości puste, co powoduje problemy w zapytaniach, funkcja NVL() będzie konwertować null do czegoś, co lubisz.

Mam nadzieję, że to pomoże.

Powiązane problemy