2012-07-08 39 views
5
select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as 
timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table 
as prod_and_ts; 

Bằng cách sử dụng truy vấn trên, tôi nhận được kết quả dưới đây.Truy vấn SQL JOIN với Bảng

USER_ID  | PRODUCT_ID | TIMESTAMPS 
------------+------------------+------------- 
1015826235  220003038067  1004841621 
1015826235  300003861266  1005268799 
1015826235  140002997245  1061569397 
1015826235  *200002448035*  1005542471 

Nếu bạn so sánh trên output from the query with the below Table2 data thì product_id trong last line of above output không phù hợp với ITEM_ID trong dòng cuối cùng trong dưới Table2 dữ liệu.

BUYER_ID  | ITEM_ID  |  CREATED_TIME 
-------------+-------------------+------------------------ 
1015826235  220003038067  2001-11-03 19:40:21 
1015826235  300003861266  2001-11-08 18:19:59 
1015826235  140002997245  2003-08-22 09:23:17 
1015826235  *210002448035*  2001-11-11 22:21:11 

Vì vậy, câu hỏi của tôi là

Tìm tất cả những PRODUCT_ID(ITEM_ID)TIMESTAMPS(CREATED_TIME) mà không phù hợp với Table2 dữ liệu tương ứng với BUYER_ID cụ thể hoặc USER_ID.

Vì vậy, tôi cần phải hiển thị kết quả như thế này cho các example- trên

BUYER_ID |  ITEM_ID  |  CREATED_TIME  |  USER_ID |  PRODUCT_ID  | TIMESTAMPS 
-----------+-------------------+-------------------------+---------------+------------------+------------------ 
1015826235  *210002448035*  2001-11-11 22:21:11  1015826235  *200002448035*  1005542471 

tôi cần phải JOIN truy vấn trên mà tôi đã viết với table2 để có được những kết quả trên. Vì vậy, tôi cần phải sử dụng truy vấn trên của tôi trong quá trình JOINING. Điều đó gây nhầm lẫn cho tôi rất nhiều. Bất kỳ đề xuất nào cũng sẽ được đánh giá cao.

UPDATE: -

tôi đã viết các truy vấn dưới đây, nhưng bằng cách nào đó tôi không thể đạt được kết quả mà tôi muốn đạt được. Bất cứ ai có thể giúp tôi với điều này?

SELECT table2.buyer_id, table2.item_id, table2.created_time from 
(select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as 
timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table 
as prod_and_ts) prod_and_ts JOIN table2 where 
prod_and_ts.user_id = table2.buyer_id 
and (product_id <> table2.item_id or 
timestamps <> UNIX_TIMESTAMP(table2.created_time)); 
+1

Tôi đang làm việc với Hive và Hive hỗ trợ SQL như cú pháp, đó là lý do tôi gắn thẻ câu hỏi này là 'sql' và' join'. Vì vậy, JOIN sẽ làm việc trong HIVE. Tôi chỉ cần JOIN cơ bản. Vì vậy, tôi nghĩ rằng cú pháp Oracle sẽ được sử dụng tốt. – ferhan

+0

Tại sao dòng cuối cùng không khớp? Có phải vì dấu thời gian không khớp với thời gian đã tạo không? – dash

+0

Tôi không chắc liệu truy vấn thực tế mà tôi đã viết có đúng hay không. Điều đó gây nhầm lẫn cho tôi rất nhiều. Vì vậy, không chắc chắn liệu các truy vấn trên là đúng hay không. – ferhan

Trả lời

2

Tôi nghĩ bạn có thể làm những gì bạn muốn với hai truy vấn, nhưng tôi không chắc chắn 100%. Thường trong tình huống này, nó là đủ để tìm những thứ trong bảng đầu tiên mà không phù hợp trong bảng thứ hai. Bạn cũng đang cố gắng để có được một trận đấu "gần nhất", đó là lý do tại sao điều này là thách thức.

Các truy vấn sau đây sẽ cho trận đấu trên sử dụng id và chính xác một trong hai lĩnh vực khác, và sau đó kết hợp chúng:

SELECT table2.buyer_id, table2.item_id, table2.created_time, prod_and_ts.* 
from (select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as timestamps 
     from testingtable2 LATERAL VIEW 
      explode(purchased_item) exploded_table as prod_and_ts 
    ) prod_and_ts JOIN 
    table2 
    on prod_and_ts.user_id = table2.buyer_id and 
     prod_and_ts.product_id = table2.item_id and 
     prod_and_ts.timestamps <> UNIX_TIMESTAMP(table2.created_time) 
union all 
SELECT table2.buyer_id, table2.item_id, table2.created_time, prod_and_ts.* 
from (select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as timestamps 
     from testingtable2 LATERAL VIEW 
      explode(purchased_item) exploded_table as prod_and_ts 
    ) prod_and_ts JOIN 
    table2 
    on prod_and_ts.user_id = table2.buyer_id and 
     prod_and_ts.product_id <> table2.item_id and 
     prod_and_ts.timestamps = UNIX_TIMESTAMP(table2.created_time) 

này sẽ không tìm thấy những tình huống mà không có trận đấu trên cả hai lĩnh vực.

Ngoài ra, tôi đã viết điều này bằng cách sử dụng cú pháp "bật" thay vì "ở đâu". Tôi cho rằng HIVE hỗ trợ điều này.

1

Đại diện của bạn quá cao để mở một bản sao và đặc biệt là 2 bản sao của cùng một câu hỏi.

Joining two Tables in Hive using HiveQL(Hadoop)

Join Two Tables and get the output from both of them

Bạn không có đủ thông tin để buộc các hồ sơ lại cho kịch bản thứ ba.
Bạn có thể làm FULL OUTER JOIN với một số OR và lấy lại mọi thứ, khớp với các hàng mà bạn có đủ thông tin như trong trường hợp đầu tiên và thứ hai bạn liệt kê và xác định rằng bạn không trả lại hàng bằng null cho trường từ bảng không khớp trong kịch bản thứ ba.

SELECT DATEPART(d,B.T1time),DATEPART(d,A.Created_TIME),* 
FROM SO_Table1HIVE A 
FULL OUTER JOIN SO_Table2HIVE B ON A.BUYER_ID = B.[USER_ID] 
AND (B.t1time = A.Created_TIME OR B.PRODUCTID = A.ITEM_ID) 

Đang cố gắng để phù hợp trên kịch bản thứ ba là một hack - thông tin là không có

này sẽ phù hợp chúng với bất kỳ đối với ngày quy định mà không phải là phù hợp với những ngày khác, nhưng một lần nữa bạn sẽ nhận được sản phẩm Descartes.

SELECT DATEPART(d,B.T1time),DATEPART(d,A.Created_TIME),* 
FROM SO_Table1HIVE A 
FULL OUTER JOIN SO_Table2HIVE B ON A.BUYER_ID = B.[USER_ID] 
AND (
    (B.t1time = A.Created_TIME OR B.PRODUCTID = A.ITEM_ID) 
    OR 
    (
     (A.Created_TIME <> B.t1time AND B.PRODUCTID <> A.ITEM_ID AND DATEPART(d,B.T1time) = DATEPART(d,A.Created_TIME)) 
     AND a.ITEM_ID NOT IN(SELECT ITEM_ID 
        FROM SO_Table1HIVE A2 
        INNER JOIN SO_Table2HIVE B2 ON A2.BUYER_ID = B2.[USER_ID] AND (A2.Created_TIME = B2.t1time OR B2.PRODUCTID = A2.ITEM_ID) 
        ) 

     AND B.PRODUCTID NOT IN(SELECT PRODUCTID 
        FROM SO_Table1HIVE A2 
        INNER JOIN SO_Table2HIVE B2 ON A2.BUYER_ID = B2.[USER_ID] AND (A2.Created_TIME = B2.t1time OR B2.PRODUCTID = A2.ITEM_ID) 
        ) 
    ) 

) 

Bạn có thể sử dụng RANK() hoặc thử một top one vv RANK() hoặc ROW_NO có lẽ sẽ là tốt nhất của các hacks nếu điều này không phải là một câu hỏi Hive, nhưng như tôi biết bạn đang sử dụng HQL, Tôi sẽ không để viết nó lên. Bạn có thể kéo chúng ra trong một bảng riêng biệt và chạy một số truy vấn cập nhật hợp lý để cập nhật nó, sau đó sử dụng nó như một bảng tra cứu để buộc lại.

tbl1Tbl2Lookup 
--------------- 
id int identity 
table1info FK 
table2info FK 

gì có lẽ bạn nên làm là những gì người trong câu hỏi bạn đưa ra một bounty về đề nghị - kể từ khi bạn thực sự không có một cách tốt để truy vấn các kịch bản thứ ba và họ cung cấp cho bạn một sự thay thế đó là cụ thể tới HIVE.

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