2013-04-01 41 views
0

我正在將一個簡單的配置表格導出到Sql服務器。兩個表都有確切的模式。在Sql Server中有一個標識列,我已經完成了「set identity_insert table_name on」。「IDENTITY_INSERT設置爲關閉」sqoop錯誤,同時將表導出到SQL Server

但是,當我從sqoop出口到SQL Server,sqoop給我一個錯誤說「IDENTITY_INSERT設置爲關閉」。

如果我出口到沒有標識列的SQL Server表,然後一切工作正常。

對此有何想法?從sqoop導出到sql server時,任何人都面臨這個問題?

謝謝

回答

1

告訴SQL Server讓你插入帶有IDENTITY列的表。這是您通常無法寫入的自動增量列。但是你可以改變它。見herehere。如果您的某個值與該列中已存在的值衝突,則它仍會失敗。

+0

好像如果你只是同時使蜂巢你的方案不要使用標識列,並同時出口提及的所有列要導出,然後這一切工作正常。但是,謝謝你的回答非常有用和信息豐富。 –

+0

是的,謝謝,我應該補充說INSERT語句通常不會提到標識列,然後SQL Server會在該字段中添加自己的自動增量值。因此,從模式中排除該列也是可行的。 – criticalfix

0

SET IDENTITY_INSERT語句是會話特定的。因此,如果通過打開查詢窗口,執行語句,然後在其他地方運行導出來設置它,則僅在該會話中設置IDENTITY_INSERT,而不是在導出會話中設置IDENTITY_INSERT。如果可能,您需要修改導出。如果沒有,直接從sqoop導出到MSSQL將不可能;相反,您需要將數據從sqoop轉儲到MSSQL可以讀取的文件(如製表符分隔),然後編寫一個首先執行SET IDENTITY_INSERT ON的語句,然後BULK INSERTs該文件,然後執行SET IDENTITY_INSERT OFF。

+0

爲了清楚起見,我設置瞭如果在我的sql服務器上關閉,然後從linux框中運行導出(當然),所以我不確定「IDENTITY_INSERT只在該會話中設置,而不在導出會話中」。而我該如何修改出口本身?我更改了要導出的列並排除了標識列,然後也出現了相同的錯誤。更加清楚的是,當我們在sqoop export命令中給出--table選項時,它是sql server表,而--export-dir選項指定hive表的hdfs目錄。對? –

+0

@AdamAnderson是對的,這可能不會直接從Linux中實現。嚴重的是,嘗試將表導出到製表符分隔的文件,然後使用SQL Server導入嚮導或SSIS包。然後有一些顯式的方法來處理SQL Server中的標識列。 – criticalfix

+0

@KumarVaibhav,我對sqoop不熟悉,但是您需要內置支持導出中的標識列,或者通過能夠在導出本身之前/之後運行任意SQL來自定義導出。否則,請嘗試將數據導出到一個文件並從MSSQL導入,其中支持標識列一定會存在。 –

0

由於我剛剛解決了我在與此相關的一些問題,在這裏是一個任何人搜索(也可能是我自己以後參考)的一個例子。

SQLSERVER_JDBC_URI="jdbc:sqlserver://<address>:<port>;username=<username>;password=<password>" 
HIVE_PATH="/user/hive/warehouse/" 
$TABLENAME=<tablename> 

sqoop-export \ 
    -D mapreduce.job.queuename=<queuename> \ 
    --connect $SQLSERVER_JDBC_URI \ 
    --export-dir "$HIVE_PATH""$TABLENAME" \ 
    --input-fields-terminated-by , \ 
    --table "$TABLENAME" \ 
    -- --schema <schema> --identity-insert 

注意最後一行上的特定位 - -- --schema <schema> --identity-insert。顯然,你可以省略模式部分,但留下額外的--

這允許您設置您的sqoop會話中該表的標識插入能力。 (source)