2012-07-01 185 views
10

這是Hive中的第一張表 - 它包含有關我們正在購買的項目的信息。查詢兩個相關表(加入)

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

而且這是在上面的表 -

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

數據我已經將數據減少到只有一個BUYER_ID(USER_ID),以使問題易於理解。

問題聲明 -

我需要比較Table2Table1,這意味着我要看看是否USER_IDTable1Table2BUYER_ID(因爲他們都是同樣的事情)在被匹配,則PURCHASED_ITEM Table2是一個PRODUCT_ID(與ITEM_ID相同)和TIMESTAMPS(與CREATED_TIME相同)的數組,應該與ITEM_IDCREATED_TIME中的Table1相同,並且有時也有可能它們(意思是PURCHASED_ITEMITEM_IDCREATED_TIME)與Table1相比較後,Table2中的一些PRODUCT_ID和TIMESTAMPS不同。

我的意思是在Table2PRODUCT_IDTIMESTAMPS計數應該是相同的表1和ITEM_ID計數CREATED_TIME針對特定BUYER_ID(USER_ID)和內容應該是一樣的。如果它們不是相同的或者從Table2中缺少條目,那麼我需要打印結果,這個特定的ITEM_IDCREATED_TIMETable2丟失,或者PRODUCT_IDTIMESTAMPSTable1相比較後不同。

因此,例如,在表1當前爲此BUYER_ID 1015826235我有5 ITEM_ID5 CREATED_TIME,所以在表2我應該在一排有5 PRODUCT_ID5 TIMESTAMPS完全相同的表1的相同USER_ID(BUYER_ID)。如果它不相同或缺少輸入,那麼我需要打印顯示缺少結果或該數據錯誤的結果。

所以只是爲了讓更多的clear-

PURCHASED_ITEM是結構的Table2一個數組,它包含兩件事情PRODUCT_IDTIMESTAMPS

如果USER_IDBUYER_ID得到匹配,然後在Table2PRODUCT_IDITEM_IDTable1TIMESTAMPSTable2匹配應CREATED_TIMETable1匹配。

修訂

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和時間戳「字符串」數據類型。而不是使用日期或TimeStamp。

對於你的問題:我認爲這裏的大問題是單獨使用字符串!

我的Oracle用戶,但應該有這樣的事情在蜂巢:

To_date({string},{Format}) 

你使用

UNIX_TIMESTAMP({string}) 

另一件事:當你有strucs,你shouls解決這樣的領域:Table2.PURCHASED_ITEM [{address}]。product_id而不是未知的Table2.product_id。

和一個建議:

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

當你CREATED_TIME和你TIME_STAMP不完全在同一個時間刻度(可能是0.001秒差異,因爲差異插入時如果插入現在或系統日期爲每個他們)你最好截斷日期到秒或毫秒或任何你認爲更好的。

還有一件事:在這裏使用NVL()或轉換空值,因爲如果你有這樣的問題,它也有可能在你的表中有空值導致查詢中的問題,NVL()函數將轉換空你喜歡的東西。

希望這會有所幫助。