【问题标题】:"IDENTITY_INSERT is set to off" sqoop error while exporting table to Sql Server将表导出到 Sql Server 时出现“IDENTITY_INSERT 设置为关闭”sqoop 错误
【发布时间】:2013-03-22 19:27:48
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: sql-server sqoop


    【解决方案1】:

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

    【讨论】:

    • 似乎如果您只是不使用该标识列,同时在配置单元中制作您的架构并在导出时提及所有要导出的列,那么一切正常。但是感谢您的回答非常有用且内容丰富。
    • 是的,谢谢,我应该补充一点,INSERT 语句通常只是不提及标识列,然后 SQL Server 在该字段中添加自己的自动增量值。因此,从架构中排除该列也是有意义的。
    • 如何从 Hive 表中 sqoop 将特定列导入 SQL Server?
    【解决方案2】:

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

    【讨论】:

    • 为了清楚起见,我在我的 sql 服务器上设置了 if off 并从 linux 框运行导出(当然)所以我不确定“IDENTITY_INSERT 仅在该会话中设置”是什么意思,不在导出会话中”。以及如何修改导出本身?我更改了要导出的列并排除了标识列,然后也出现了同样的错误。更清楚一点,当我们在 sqoop 导出命令中给出 --table 选项时,它是 sql server 表,而 --export-dir 选项为 hive 表指定了我的 hdfs 目录。对吗?
    • @AdamAnderson 是对的,这可能无法直接在 Linux 之外进行。说真的,尝试将表导出到制表符分隔的文件,然后使用 SQL Server 导入向导或 SSIS 包。然后有一些明确的方法可以在 SQL Server 中处理标识列。
    • @KumarVaibhav,我不熟悉 sqoop,但您需要在其导出中内置对标识列的支持,或者通过能够在之前/之后运行任意 SQL 来自定义导出的能力出口本身。否则,尝试将数据导出到文件并从 MSSQL 中导入,其中肯定存在对标识列的支持。
    【解决方案3】:

    简而言之:

    后缀 -- --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 &lt;schema&gt; --identity-insert 。您可以省略架构部分,但保留额外的--

    这允许您在 sqoop 会话中为该表设置身份插入功能。 (source)

    【讨论】:

    • 这是必须接受的答案!!!因为我们是从 Sqoop 而不是服务器级别设置它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多