2013-03-24 6 views
11

का उपयोग कर एस 3 से एडब्ल्यूएस रेडशिफ्ट से डेटा कॉपी करना मुझे एस 3 से डेटा लोड करने के लिए कॉपी कमांड को निष्पादित करने में समस्याएं हैं जो अजगर के रेडशिफ्ट से पायथन से लोड हो रही हैं।
मैं निम्नलिखित प्रतिलिपि आदेश दिया है:पायथन और psycopg2

copy moves from 's3://<my_bucket_name>/moves_data/2013-03-24/18/moves' 
credentials 'aws_access_key_id=<key_id>;aws_secret_access_key=<key_secret>' 
removequotes 
delimiter ','; 

जब मैं इस आदेश एसक्यूएल Workbench/j सब कुछ का उपयोग कर निष्पादित काम करता है के रूप में उम्मीद है, लेकिन जब मैं अजगर के साथ इस पर अमल और आदेश पारित ठीक psycopg2 करने की कोशिश, लेकिन कोई डेटा नहीं है लोड किया गया और कोई त्रुटि नहीं फेंक दी गई है।
की कोशिश की निम्न दो विकल्प (मान psycopg2 कनेक्शन ठीक है, क्योंकि यह है):

cursor.execute(copy_command) 
cursor.copy_expert(copy_command, sys.stdout) 

दोनों कोई चेतावनी अभी तक डेटा लोड नहीं है

विचारों के साथ पारित?

धन्यवाद

+0

निष्पादन के बाद आपको प्रतिबद्ध() को कॉल करने की आवश्यकता है (अन्यथा यह प्रभावी नहीं होगा। – ciphor

उत्तर

-6

वाक्य रचना DDL बयानों के समान होना चाहिए

# Create table 
c.execute('''CREATE TABLE stocks 
      (date text, trans text, symbol text, qty real, price real)''') 
22

मैं सफलतापूर्वक इस सटीक सेटअप (psycopg2 + लाल विचलन + कॉपी) का इस्तेमाल किया है। क्या आपने बाद में किया? एसक्यूएल वर्कबेंच ऑटो-प्रतिबद्ध करने के लिए डिफ़ॉल्ट है जबकि psycopg2 लेनदेन खोलने के लिए डिफ़ॉल्ट है, इसलिए जब तक आप अपने कनेक्शन पर प्रतिबद्ध() को कॉल नहीं करते हैं तब तक डेटा दिखाई नहीं देगा।

पूर्ण कार्यप्रवाह है:

conn = psycopg2.connect(...) 
cur = conn.cursor() 
cur.execute("COPY...") 
conn.commit() 

मैं नहीं मानता कि copy_expert() या cursor.copy_ के किसी भी * आदेशों Redshift साथ काम करते हैं।

+0

इसने मेरे लिए समस्या हल की। मैं कॉपी कमांड चलाने के लिए अपने स्क्लेक्लेमी फ्रेमवर्क का उपयोग करने की कोशिश कर रहा था और मुझे लोड करने के लिए लोड नहीं मिल सका। संबंधित धागा यहां: http://stackoverflow.com/questions/28271049/redshift-copy-operation-doesnt-work-in-sqlalchemy दुर्भाग्यवश एसक्लाल्चेमी के साथ ऑटो प्रतिबद्ध समाधान ने समझाया कि मेरे लिए काम नहीं किया गया है, लेकिन उपर्युक्त psycopg2 के साथ –

+0

@ वोकेट इसे मेरे लिए निष्पादित करने पर फंस गया है और फिर conn.commit() चला नहीं सकता है। कोई सुझाव? – Dnaiel

9

सबसे पहले, सुनिश्चित करें कि लेनदेन प्रतिबद्ध है।

conn = psycopg2.connect(conn_string) 
cur = conn.cursor() 
cur.execute(copy_cmd_str) 
conn.commit() 

आप,

with psycopg2.connect(conn_string) as conn: 
    with conn.cursor() as curs: 
     curs.execute(copy_cmd_str) 

सुनिश्चित कर सकते हैं जिस तरह से निम्नलिखित के रूप में अच्छी तरह से (संसाधनों को रिहा सुनिश्चित) के साथ एक लेन-देन के लिए प्रतिबद्ध, जब एक कनेक्शन ब्लॉक के साथ बाहर निकल जाता है, तो भी इसका अपवाद नहीं ब्लॉक द्वारा उठाया गया , लेनदेन प्रतिबद्ध है। अपवाद के मामले में लेनदेन वापस लुढ़का है।

दूसरा, प्रतिबद्ध डेटा लोड होने पर मदद नहीं करता है, कुछ समय लगता है और कनेक्ट_टाउटआउट (और प्रतिबद्ध नहीं हो सकता) से अधिक है। तो जब स्पष्ट प्रतिबद्धता मदद नहीं करता है, तो बढ़ी हुई टाइमआउट के साथ प्रयास करें।

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