2013-03-07 79 views
12

我正試圖將一些MySQL表遷移到Amazon Redshift,但遇到了一些問題。如何將csv數據文件複製到Amazon RedShift?

步驟很簡單: 1.轉儲MySQL表到csv文件 2.上傳csv文件到S3 3.複製數據文件到紅移在步驟3中出現

錯誤:

的SQL命令是:

copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' csv;

錯誤信息:

An error occurred when executing the SQL command: copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx ERROR: COPY CSV is not supported [SQL State=0A000] Execution time: 0.53s 1 statement(s) failed.

我不知道csv文件的格式是否有任何限制,比如分隔符和引號,我在文檔中找不到它。

任何人都可以提供幫助嗎?

+0

您將需要引用Redshift開發者文檔的[「從Amazon S3加載數據」](http://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-S3.html)和['COPY'語法](http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html)部分。不幸的是,你第一眼看起來很好看...... – Charles 2013-03-07 02:52:18

+1

謝謝,問題解決後,添加「removequote」選項 – ciphor 2013-03-07 04:54:52

+0

@ciphor請發佈這個答案,而不是評論。 – Sundar 2013-03-12 07:00:51

回答

12

問題最終通過解析:

copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' removequotes;

更多信息可以在這裏找到http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

+0

您可以接受您自己的答案,將此問題標記爲已回答。 – 2013-03-19 17:33:26

+0

您可以檢查stl_load_errors表以查找有關模糊錯誤消息的更多特定信息。 ''select * from stl_load_errors;'' – koonse 2013-04-15 22:31:09

+0

它應該是'removequotes',而不是removequote .. – 2013-06-19 12:45:32

0

如果你想保存你的自我一些代碼/你有一個非常基本的使用情況,你可以使用亞馬遜數據管道。 它統計現貨實例,並執行亞馬遜網絡內的轉型,這真的直觀的工具(但很簡單,所以你不能做複雜的事情吧)

+0

據我所知,數據管道不支持紅移呢。 – ciphor 2013-08-11 12:55:58

+0

我已經看過數據管道線了,對不起我是壞人。 – asafm 2013-08-12 13:06:46

+0

@ciphor [本文](http://aws.amazon.com/articles/1143507459230804)使它看起來像它(或我錯過了什麼?) – 2013-09-27 04:14:39

9

現在亞馬遜紅移支持COPY命令CSV選項。最好使用此選項正確導入CSV格式的數據。格式如下所示。

COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV;

缺省的分隔符是(,),默認引號是(「)。您也可以用CSV和這樣的DELIMITER選項導入TSV格式的數據。

COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV DELIMITER '\t';

有使用舊的方式(DELIMITER和REMOVEQUOTES)時,REMOVEQUOTES不支持在封閉的字段中有新的行或分隔符字符,這是一些缺點。如果數據可以包含此類字符,則應使用CSV選項。

有關詳細信息,請參閱以下鏈接。

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

+0

如果您面對**分界符未找到。**錯誤,則此答案是可行的解決方案。 – CLOUGH 2018-01-10 12:15:13

0

它看起來像你想的本地文件加載到紅移表。 CSV文件必須在S3的COPY命令的工作。

如果你可以提取表到CSV數據文件,你又多了一個腳本選項。您可以使用Python/boto/psycopg2組合將您的CSV加載腳本編寫到Amazon Redshift。

在我MySQL_To_Redshift_Loader我做了以下內容:

  1. 從MySQL提取數據到臨時文件。

    loadConf=[ db_client_dbshell ,'-u', opt.mysql_user,'-p%s' % opt.mysql_pwd,'-D',opt.mysql_db_name, '-h', opt.mysql_db_server]  
    ... 
    q=""" 
    %s %s 
    INTO OUTFILE '%s' 
    FIELDS TERMINATED BY '%s' 
    ENCLOSED BY '%s' 
    LINES TERMINATED BY '\r\n'; 
    """ % (in_qry, limit, out_file, opt.mysql_col_delim,opt.mysql_quote) 
    p1 = Popen(['echo', q], stdout=PIPE,stderr=PIPE,env=env) 
    p2 = Popen(loadConf, stdin=p1.stdout, stdout=PIPE,stderr=PIPE) 
    ... 
    
  2. 使用boto Python模塊和分段上傳將數據壓縮並加載到S3。

    conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) 
    bucket = conn.get_bucket(bucket_name) 
    k = Key(bucket) 
    k.key = s3_key_name 
    k.set_contents_from_file(file_handle, cb=progress, num_cb=20, 
    reduced_redundancy=use_rr) 
    
  3. 使用psycopg2 COPY命令將數據添加紅移表。

    sql=""" 
    copy %s from '%s' 
    CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' 
    DELIMITER '%s' 
    FORMAT CSV %s 
    %s 
    %s 
    %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader) 
    
0

由於該決議已經提供了,我就不再重複了明顯。

但是,如果你收到一些錯誤,當你連接到任何紅移帳戶您無法弄清楚,只要在您的工作臺上執行:

select * from stl_load_errors [where ...]; 

stl_load_errors包含所有亞馬遜RS加載歷史的方式錯誤,其中普通用戶可以查看詳細信息,相當於他/她自己的帳戶,但超級用戶可以擁有所有的接入。

細節的精心捕捉: Amazon STL Load Errors Documentation

0

有點晚發表評論,但它可能是有用的: -

您可以使用一個開源項目,可以直接從MySQL複製表到紅移 - sqlshift

它只需要火花,如果你有絲那麼它也可以使用。

優點: - 它會自動決定使用主鍵distkey交錯sortkey

相關問題