2013-04-01 21 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)