将表导出到Sql Server时,“IDENTITY_INSERT设置为关”sqoop错误

时间:2013-04-01 17:29:33

标签: sql-server sqoop

我正在将一个简单的hive表导出到Sql server。两个表都具有确切的模式。在Sql Server中有一个标识列,我在其上完成了“set identity_insert table_name on”。

但是当我从sqoop导出到sql server时,sqoop给我一个错误,说“IDENTITY_INSERT设置为off”。

如果我导出到没有标识列的Sql Server表,那么一切正常。

对此有何想法?任何人在从sqoop导出到sql server时遇到此问题?

由于

3 个答案:

答案 0 :(得分:1)

告诉SQL Server允许您使用IDENTITY列插入表中。这是一个你通常无法写入的自动增量列。但你可以改变它。请参阅herehere。如果您的某个值与该列中已存在的值发生冲突,它仍然会失败。

答案 1 :(得分:1)

  

简而言之:

     

Postfix -- --identity-insert到您的Sqoop导出命令

详细说明:

这是一个搜索任何人的例子(也可能是我以后的参考资料)。

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)

答案 2 :(得分:0)

SET IDENTITY_INSERT语句是特定于会话的。因此,如果通过打开查询窗口,执行语句,然后在其他任何地方运行导出来设置它,则IDENTITY_INSERT仅在该会话中设置,而不是在导出会话中设置。如果可能,您需要修改导出本身。如果没有,将无法直接从sqoop导出到MSSQL;相反,您需要将数据从sqoop转储到MSSQL可以读取的文件(例如制表符分隔),然后编写一个首先执行SET IDENTITY_INSERT ON的语句,然后BULK INSERT该文件,然后执行SET IDENTITY_INSERT OFF。