我正在将一个简单的hive表导出到Sql server。两个表都具有确切的模式。在Sql Server中有一个标识列,我在其上完成了“set identity_insert table_name on”。
但是当我从sqoop导出到sql server时,sqoop给我一个错误,说“IDENTITY_INSERT设置为off”。
如果我导出到没有标识列的Sql Server表,那么一切正常。
对此有何想法?任何人在从sqoop导出到sql server时遇到此问题?
由于
答案 0 :(得分:1)
答案 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。