2012-07-08 21 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; 

उपर्युक्त क्वेरी का उपयोग करके, मुझे नीचे आउटपुट मिल रहा है।तालिका क्वेरी के साथ SQL क्वेरी जॉइन

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

आप ऊपर output from the query with the below Table2 data की तुलना करें, तो last line of above output में product_idITEM_ID साथ अंतिम पंक्ति में नीचे Table2 डेटा में मिलान नहीं है।

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 

तो मेरे सवाल है

खोजें उन सभी PRODUCT_ID(ITEM_ID) और TIMESTAMPS(CREATED_TIME) कि Table2 डेटा विशेष BUYER_ID या USER_ID करने के लिए इसी के साथ मिलान नहीं कर रहे हैं।

तो मैं ऊपर उदाहरण

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

मैं ऊपर क्वेरी कि मैं table2 के साथ लिखा था ऊपर परिणाम प्राप्त करने के शामिल होने की आवश्यकता के लिए इस तरह परिणाम दिखाने की जरूरत है। तो मुझे जॉइनिंग प्रक्रिया में मेरी उपर्युक्त क्वेरी का उपयोग करने की आवश्यकता है। यह मुझे बहुत भ्रमित कर रहा है। सभी सुझावों का स्वागत है।

अद्यतन: -

मैं नीचे क्वेरी लिखा था, लेकिन किसी भी तरह मैं उत्पादन है कि मैं प्राप्त करने के लिए चाहता था प्राप्त करने में सक्षम नहीं हूँ। क्या कोई मुझे इस बारे में सहायता कर सकता है?

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

मैं हाइव के साथ काम कर रहा हूं, और हाइव एसक्यूएल को सिंटैक्स की तरह समर्थन करता है इसलिए यही कारण है कि मैं इस प्रश्न को 'एसक्यूएल' और 'जॉइन' के रूप में टैग करता हूं। तो जॉइन में काम करेंगे जॉइन। मुझे बस मूल रूप से जुड़ने की जरूरत है। तो मुझे लगता है कि ओरेकल वाक्यविन्यास ठीक रहेगा। – ferhan

+0

अंतिम पंक्ति क्यों मेल नहीं खाती है? क्या यह टाइमस्टैम्प की वजह से निर्मित समय से मेल नहीं खाता है? – dash

+0

मुझे यकीन नहीं है कि मैंने जो वास्तविक क्वेरी लिखा है वह सही है या नहीं। यह मुझे बहुत भ्रमित कर रहा है। तो सुनिश्चित नहीं है कि उपरोक्त क्वेरी सही है या नहीं। – ferhan

उत्तर

2

मुझे लगता है कि आप दो प्रश्नों के साथ जो चाहते हैं वह कर सकते हैं, लेकिन मैं 100% निश्चित नहीं हूं। अक्सर इस स्थिति में, पहली तालिका में चीजों को खोजने के लिए पर्याप्त है जो दूसरी तालिका में मेल नहीं खाते हैं। आप "निकटतम" मैच पाने की भी कोशिश कर रहे हैं, यही कारण है कि यह चुनौतीपूर्ण है।

निम्न क्वेरी प्रयोक्ता आईडी पर मिलान ढूंढता है और वास्तव में अन्य दो क्षेत्रों में से एक, और फिर उन्हें जोड़ती है:

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) 

यह स्थितियों में, जहां या तो मैदान पर उसका कोई मिलान नहीं है नहीं मिलेगा।

इसके अलावा, मैंने इसे "कहां" के बजाय "चालू" वाक्यविन्यास का उपयोग करके लिखा है। मुझे लगता है कि HIVE इसका समर्थन करता है।

1

आपका प्रतिनिधि एक डुप्लिकेट और विशेष रूप से एक ही प्रश्न के 2 डुप्लीकेट खोलने के लिए बहुत अधिक है।

Joining two Tables in Hive using HiveQL(Hadoop)

Join Two Tables and get the output from both of them

आप रिकॉर्ड तीसरे परिदृश्य के लिए वापस टाई करने के लिए पर्याप्त जानकारी नहीं है।
आप FULL OUTER JOIN को OR के साथ कर सकते हैं और सब कुछ वापस प्राप्त कर सकते हैं, पंक्तियों से मेल करें कि आपके पास पहले और दूसरे मामले में पर्याप्त जानकारी है, और उन रिक्स की पहचान करें जिन्हें आप खेतों के लिए नल के साथ पंक्तियों को वापस नहीं कर रहे हैं तीसरे परिदृश्य में गैर मिलान तालिका से।

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) 

तीसरे परिदृश्य पर मिलान करने के लिए कोशिश कर रहा एक हैक है - जानकारी नहीं है वहाँ

इससे उन्हें निर्धारित तिथि कि अन्य दिनों में मिलान नहीं कर रहे हैं के लिए किसी के साथ मिलान कर देंगे, लेकिन फिर आप कार्टेशियन उत्पादों को प्राप्त करेंगे।

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

) 

आप RANK() का उपयोग करें या एक top one, की कोशिश कर सकते आदि RANK() या ROW_NO शायद इन हैक्स के सबसे अच्छा होगा अगर यह एक हाइव सवाल नहीं थे, लेकिन के रूप में मैं जानता हूँ कि आपके HQL का उपयोग कर रहे हैं, मैं नहीं जा रहा हूँ इसे लिखने के लिए। आप उन्हें एक अलग तालिका में खींच सकते हैं और इसे अद्यतन करने के लिए कुछ लॉजिकल अपडेट क्वेरी चला सकते हैं, फिर इसे वापस टाई करने के लिए लुकअप टेबल के रूप में उपयोग करें।

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

क्या आप शायद करना चाहिए क्या सवाल में व्यक्ति को आप पर एक इनाम की पेशकश की है का सुझाव दिया - जब से तुम वास्तव में तीसरा परिदृश्य क्वेरी करने के लिए एक अच्छा तरीका नहीं है और वे तुम्हें एक विकल्प है कि विशिष्ट है की पेशकश की करने के लिए

संबंधित मुद्दे