0

我正在将一个简单的配置单元表导出到 Sql 服务器。两个表都有确切的架构。Sql Server 中有一个标识列,我在上面做了一个“set identity_insert table_name on”。

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

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

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

谢谢

4

3 回答 3

2

简而言之:

Sqoop-- --identity-insert导出命令的后缀


详细的:

这是任何人搜索的示例(可能供我自己以后参考)。

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 会话中为该表设置身份插入功能。(来源)

于 2017-02-04T03:55:28.540 回答
1

告诉 SQL Server 让您插入到具有 IDENTITY 列的表中。这是您通常无法写入的自动增量列。但是你可以改变它。见这里这里。如果您的值之一与该列中已经存在的值冲突,它仍然会失败。

于 2013-04-01T17:44:55.017 回答
0

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

于 2013-04-01T20:38:44.047 回答