2012-07-01 20 views
10

Bu, Hive'daki İlk tablodur - Satın aldığımız öğe hakkında bilgi içerir.İki ilgili tabloyu sorgula (Katıl)

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 
) 

Ve bu yukarıdaki birinci tabloda

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

Bu Ayrıca biz satın alan öğeler hakkında bilgi içerir Hive- İkinci tablodur içinde veridir.

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

Ve bu sadece bir BUYER_ID (USER_IDEND_LINK) anlamak için sorun basit hale getirmek için veri azaltmıştır yukarıdaki masanın

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

içinde veridir.

Sorun BEYANNAMESİ

ben de o zaman, PURCHASED_ITEM eşleşti alır (her ikisi de aynı şey gibi) ben USER_ID eğer Table1 den Table2 ve BUYER_ID görmek gerekir demektir Table1 ile Table2 karşılaştırmak gerekir PRODUCT_ID Dizisi (TIMESTAMPS ile aynı) ve CREATE_TIME ile aynı olan ITEM_ID ve ile aynı olan USER_ID (BUYER_ID) için bir tablo olan Table2 ve bazen de (PURCHASED_ITEM veanlamına gelir), CREATED_TIME) aynı veya bazı PRODUCT_ID ve TIMESTAMPS, Table2'dan Table1 karşılaştırmasından sonra eksiktir. Bununla

o belirli BUYER_ID (USER_IDEND_LINK) ve içerik aynı olmalıdır için Tablo 1 'de ITEM_ID ve CREATED_TIME sayımı ile aynı olmalıdır Table2 içinde PRODUCT_ID ve TIMESTAMPS sayısını anlamına gelir. bunlar aynı değildir veya giriş Table2 gelen eksikse, o zaman sonuç yazdırmak gerekiyor, bu özel ITEM_ID ve CREATED_TIMETable2 eksik veya PRODUCT_ID ve TIMESTAMPSTable1 gelen karşılaştırdıktan sonra aynı değildir.

Yani şu anda ben bir satırda aynı USER_ID(BUYER_ID) için Table1 5 PRODUCT_ID ve 5 TIMESTAMPS tam olarak aynı olmalıdır Table2 yüzden 5 ITEM_ID ve 5 CREATED_TIME sahip bu BUYER_ID 1015826235 için Tablo-1'de örneğin. Aynı değilse veya giriş eksikse, bunun eksik olduğunu veya bu verilerin yanlış olduğunu gösteren sonucu yazdırmam gerekiyor.

Dolayısıyla, sadece

PURCHASED_ITEM daha iyi okunabilecek hale getirmek için Table2 yılında Struct bir dizidir ve o iki şey PRODUCT_ID ve TIMESTAMPS içerir.

USER_ID ve BUYER_ID sonra eşleşti alır Table2 yılında PRODUCT_IDTable1 yılında CREATED_TIME ile sonlandırılması gerekir Table2 içinde Table1 ve TIMESTAMPS yılında ITEM_ID ile sonlandırılması gerekir.

GÜNCELLEME

HiveQL SQL Sorgu Soru: - Önce soru için yazdığı

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. 

Sorgu. Sorgu doğru mu?

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

Tüm bu kalın metinler biraz köreliyordu. – Ben

cevap

0

Ben Hive aşina değilim, ama Table1 aynı şema ile geçici tablo oluşturmak olduğunu göstermektedir ve (zaman damgası dönüşüm) Tablo2 verilerle doldurun ederim. Destekleniyorsa bu, sonunda bir görünüm olabilir. iki tablo içeriğini karşılaştırılması

gibi sorgu ile daha sonra mümkündür:

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

Yorum yapmak için teşekkürler. Ama bu HiveQL ile çalışmayacak sanırım. :( – AKIWEB

1

Ben Harder karşılaştırmalar yapar çünkü sizin CREATED_TIME ve zaman damgası için "dize" veri türü kullanmamanızı öneriyoruz. Bunun yerine Date veya TimeStamp kullanın.

Ve sorunuz için: Bence burada büyük sorun tek başına dizeleri kullanıyor!

ben oracle kullanıcısı değilim ama Hive böyle bir şey olması gerekir: Eğer strucs varken, böyle alanları ele shouls: Eğer

UNIX_TIMESTAMP({string}) 

başka şey kullanıldığı gibi

To_date({string},{Format}) 

: Tablo2.PURCHASED_ITEM [{address}]. Product_id ve bilinmeyen Table2.product_id değil.

ve bir daha öneri:

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

sizin CREATED_TIME ve time_stamp aynı zaman keneler size her biri için Şimdi eklemek veya SysDate değilse tam olarak (çünkü fark insert zaman farkı 0.001 saniye olabilir vardır Onları) tarihini saniyeler veya Milli-saniye veya daha iyi olduğunu düşündüğünüz her şeyden daha iyi kesersiniz.

Bir şey daha: NVL() veya null değerlerini burada da kullan, bu tür sorunlarınız varsa, tablonuzda null değerlere sahip olmanız da olasıdır, bu da sorgunuzda sorunlara neden olur, NVL() işlevi dönüşür sevdiğin bir şeye null.

Bu yardımcı olur umarım.