2012-07-01 38 views
10

Đây là bảng đầu tiên trong Hive- Nó chứa thông tin về mặt hàng chúng tôi đang mua.Truy vấn hai bảng liên quan (Tham gia)

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 
) 

Và đây là các dữ liệu trong bảng đầu tiên trên

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

Đây là bảng thứ hai trong Hive- Nó cũng chứa thông tin về các mặt hàng chúng tôi đang mua.

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

Và đây là các dữ liệu trong Bảng- trê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"}] 

Tôi đã giảm dữ liệu đến chỉ có một BUYER_ID (USER_ID) để làm cho vấn đề đơn giản để hiểu.

Vấn đề Câu lệnh

Tôi cần phải so sánh với Table2Table1, có nghĩa là tôi cần phải xem nếu USER_ID từ Table2BUYER_ID từ Table1 (như họ cả hai đều là điều tương tự) được xuất hiện, sau đó PURCHASED_ITEM trong Bảng 2 là một mảng của PRODUCT_ID (giống như ITEM_ID) và TIMESTAMPS (giống như CREATED_TIME) phải giống như ITEM_IDCREATED_TIME trong Table1 cho USER_ID cụ thể đó (BUYER_ID) và đôi khi có thể chúng (có nghĩa là PURCHASED_ITEM và), CREATED_TIME) không giống nhau hoặc thiếu một số PRODUCT_ID và TIMESTAMPS từ Table2 sau khi so sánh từ Table1.

Bằng cách này, tôi có nghĩa là đếm PRODUCT_IDTIMESTAMPS trong Table2 nên giống như đếm ITEM_IDCREATED_TIME trong Table1 cho rằng BUYER_ID cụ thể (USER_ID) và nội dung cần được như vậy. Nếu chúng không thiếu hoặc thiếu mục nhập từ Table2, thì tôi cần in kết quả, thiếu ITEM_IDCREATED_TIME cụ thể này từ Table2 hoặc PRODUCT_IDTIMESTAMPS không giống nhau sau khi so sánh từ Table1.

Vì vậy, ví dụ như trong Table1 hiện cho BUYER_ID 1015826235 này tôi có 5 ITEM_ID5 CREATED_TIME, vì vậy trong Table2 tôi nên có 5 PRODUCT_ID5 TIMESTAMPS chính xác giống như Table1 cho cùng USER_ID(BUYER_ID) trong một hàng. Nếu nó không phải là cùng hoặc mục nhập là mất tích sau đó tôi cần phải in kết quả cho thấy điều này là mất tích hoặc dữ liệu này là sai.

Vì vậy, chỉ để làm cho nó clear- hơn

PURCHASED_ITEM là một mảng của Struct trong Table2 và nó chứa hai điều PRODUCT_IDTIMESTAMPS.

Nếu USER_IDBUYER_ID được xuất hiện sau đó PRODUCT_ID trong Table2 nên được xuất hiện với ITEM_ID trong Table1TIMESTAMPS trong Table2 nên được xuất hiện với CREATED_TIME trong Table1.

CẬP NHẬT

Câu hỏi HiveQL SQL Query: -

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. 

Query mà tôi đã viết cho câu hỏi đầu tiên. Truy vấn có đúng không?

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ất cả văn bản in đậm đó đều hơi bị mờ. – Ben

Trả lời

0

Tôi không quen thuộc với Hive, nhưng tôi muốn đề nghị bạn nên tạo một bảng tạm thời với các lược đồ tương tự như Table1, và điền nó với dữ liệu Table2 (với chuyển đổi timestamp). Điều này cuối cùng có thể là một chế độ xem, nếu được hỗ trợ.

So sánh nội dung của hai bảng là sau đó có thể với các truy vấn như:

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

Cảm ơn bạn đã nhận xét. Nhưng điều này sẽ không làm việc với HiveQL tôi đoán. :( – AKIWEB

1

tôi đề nghị bạn không sử dụng "chuỗi" kiểu dữ liệu cho CREATED_TIME và timestamp của bạn bởi vì nó làm cho sự so sánh Harder. Thay vì sử dụng Date hoặc TimeStamp.

Và cho câu hỏi của bạn: Tôi nghĩ rằng vấn đề lớn ở đây là sử dụng dây một mình!

Tôi sử dụng oracle nhưng không nên có một cái gì đó như thế này trong Hive:

To_date({string},{Format}) 

như bạn sử dụng

UNIX_TIMESTAMP({string}) 

Một điều: khi bạn có strucs, bạn shouls giải quyết các lĩnh vực như thế này : Table2.PURCHASED_ITEM [{address}]. Product_id và không phải là Table2.product_id không xác định.

và thêm một gợi ý:

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

khi CREATED_TIME của bạn và time_stamp của bạn là không chính xác trong cùng một thời bọ ve (có thể 0,001 giây khác biệt vì thời gian chèn khác biệt nếu bạn chèn Bây giờ hoặc sysdate cho mỗi họ) bạn tốt hơn cắt ngắn ngày để giây hoặc vài giây hoặc bất cứ điều gì bạn nghĩ là tốt hơn.

Một điều nữa: Sử dụng NVL() hoặc chuyển đổi giá trị null ở đây, bởi vì nếu bạn có vấn đề như vậy, cũng có thể có giá trị null trong bảng của bạn gây ra vấn đề trong truy vấn của bạn, hàm NVL() sẽ chuyển đổi null cho một cái gì đó bạn thích.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan