2012-07-01 3 views
10

이것은 하이브의 첫 번째 테이블입니다. 여기에는 구매할 항목에 대한 정보가 들어 있습니다.두 개의 관련 테이블 쿼리 (조인)

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 
) 

는 그리고 이것은 위의 첫 번째 테이블

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

이것은 또한 우리가 구입하는 항목에 대한 정보를 포함 Hive-에 두 번째 테이블에서 데이터입니다.

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

는 그리고 이것은 내가 하나의 BUYER_ID (USER_ID) 이해 문제가 간단하게하기에 데이터를 감소 위의 테이블 -

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

의 데이터입니다.

문제 명령문 -

난에 다음 PURCHASED_ITEM 일치됩니다 (둘 다 같은 일이기 때문에) 내가 USER_ID 경우 Table1에서 Table2BUYER_ID에서 볼 필요가 의미하는 Table1Table2을 비교해야 해당 USER_ID (BUYER_ID)에 대해 PRODUCT_ID (ITEM_ID와 동일) 및 TIMESTAMPS (CREATED_TIME과 동일)의 배열 인 Table2는 ITEM_IDCREATED_TIME과 같아야하며, 경우에 따라 PURCHASED_ITEM 및를 의미 할 수도 있습니다, CREATED_TIME)은 Table1과 비교하여 Table2에서 PRODUCT_ID 및 TIMESTAMPS가 누락되었습니다. 이로써

I는 해당 특정 BUYER_ID (USER_ID)과 콘텐츠가 동일해야 대한 표 1에서와 ITEM_IDCREATED_TIME 카운트과 동일해야 Table2PRODUCT_IDTIMESTAMPS의 개수를 의미한다. 일치하지 않거나 항목이 누락되었거나 Table2에서 누락 된 경우 Table2에서 ITEM_IDCREATED_TIME이 누락되거나 Table1과 비교하여 PRODUCT_IDTIMESTAMPS이 일치하지 않습니다. 결과를 인쇄해야합니다.

그래서 현재 내가 한 행에서 같은 USER_ID(BUYER_ID)에 대한 표와 같은 5 PRODUCT_ID5 TIMESTAMPS 정확히 동일해야 표 2에서, 그래서 내가 5 ITEM_ID5 CREATED_TIME이이 BUYER_ID 1015826235에 대한 표 예를 들면. 동일하지 않거나 항목이 누락 된 경우 누락되거나이 데이터가 잘못되었다는 결과를 인쇄해야합니다.

그래서 단지

PURCHASED_ITEM 더 clear- 수 있도록하는 Table2에서 구조체의 배열이며 두 가지 PRODUCT_IDTIMESTAMPS이 포함되어 있습니다.

USER_IDBUYER_ID 경우 일치됩니다 Table2PRODUCT_IDTable1CREATED_TIME와 일치해야 Table2Table1TIMESTAMPSITEM_ID과 일치해야합니다.

업데이트]

HiveQL SQL 쿼리 질문 : - 나는 첫 번째 질문에 대한 쓴

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. 

쿼리. 검색어가 맞습니까?

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

굵게 표시된 텍스트는 모두 눈이 멀었습니다. – Ben

답변

0

나는 하이브에 익숙하지 해요,하지만 난 당신이 표 1과 같은 스키마와 임시 테이블을 만들 것을 제안하고, (타임 스탬프 변환을) 표 2의 데이터로 채울 것입니다. 지원되는 경우 결국보기가 될 수 있습니다. 두 테이블의 내용을 비교

같은 쿼리를 다음 수 :

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

주석 해 주셔서 감사합니다. 하지만 이것은 HiveQL에서 작동하지 않습니다. :( – AKIWEB

1

나는 그것이 더 세게 비교를 만들기 때문에 당신이 당신의 CREATED_TIME 및 타임 스탬프 "문자열"데이터 형식을 사용하지 않는 것이 좋습니다. 대신에 Date 또는 TimeStamp를 사용하십시오.

귀하의 질문에 대한 : 나는 여기에 큰 문제가 혼자 문자열을 사용하는 것 같아!

나는 오라클 사용자를 합니다만 하이브에서 이런 일이 있어야한다 : 당신이 strucs이있을 때,이 같은 필드를 해결 shouls : 당신이

UNIX_TIMESTAMP({string}) 

또 다른 일을 사용

To_date({string},{Format}) 

: Table2.PURCHASED_ITEM [{address}]. product_id 및 알 수없는 Table2.product_id가 아닙니다.

및 하나 개 더 제안 :

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

당신의 CREATED_TIME하고 TIME_STAMP가 동시에 틱은 각 이제 삽입 또는 SYSDATE 경우 정확히 (때문에 차이 삽입 시간의 차이는 0.001 초 될 수 있습니다 그들) 당신은 더 나은 초 또는 milli 초 또는 당신이 생각하는 무엇 이건을 잘 자릅니다.

한 가지 더 : NVL()을 사용하거나 여기에도 null 값을 변환하십시오. 이러한 문제가있는 경우 테이블에 null 값을 포함하여 쿼리에 문제가 발생할 수 있기 때문에 NVL() 함수가 변환됩니다 네가 좋아하는 것에 null.

희망이 도움이됩니다.