【问题标题】:'ERROR: cursor "C_2" already exists' when importing from Vertica using Sqoop使用 Sqoop 从 Vertica 导入时出现“错误:光标“C_2”已存在”
【发布时间】:2014-09-01 14:58:10
【问题描述】:

我正在使用以下命令通过 Sqoop 从 Vertica 导入:

sqoop import --driver com.vertica.Driver --connect jdbc:vertica://[host]:[port]/[db] --username [username] --password [pass] -m 1 --table [table]

这会失败并出现以下错误:

14/09/01 15:12:21 INFO manager.SqlManager: Using default fetchSize of 1000
14/09/01 15:12:21 INFO tool.CodeGenTool: Beginning code generation
14/09/01 15:12:21 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM [table] AS t WHERE 1=0
14/09/01 15:12:21 ERROR manager.SqlManager: Error executing statement: com.vertica.util.PSQLException: ERROR: cursor "C_2" already exists
com.vertica.util.PSQLException: ERROR: cursor "C_2" already exists

我尝试了各种 Sqoop 选项,并进行了多次谷歌搜索,但无法弄清楚为什么会出现此错误或如何解决它。

似乎 Vertica 确实对光标有一些限制,例如 stated here:

光标只能向前,不可滚动。结果集不能 更新。连接支持在任意位置执行单个语句 时间。如果要同时执行多个语句,打开 多个连接。因为 HP Vertica 没有存储 程序,不支持 CallableStatement。这 DatabaseMetaData.getProcedures() 和 .getProcedureColumns() 方法 返回有关 SQL 函数(包括 UDF)的信息,而不是 存储过程。

所以我目前最好的猜测是 Sqoop 使用光标打开的连接不止一个?但话又说回来,我只使用一个映射器,所以我不确定情况是否如此。

谁能给我更多关于我为什么会收到这个错误的信息,或者如何解决它?

还有其他不使用游标的连接管理器吗?

我正在使用 Vertica 5 和 Vertica JDBC 4。Sqoop 1.4.5。 list-tables 工作正常。使用--query 导入自定义查询时出现一些错误,所以我认为SQL 是正确的。我在export 上遇到同样的错误

【问题讨论】:

    标签: sqoop vertica


    【解决方案1】:

    看起来 Vertica 不支持在 JDBC 中设置提取大小。因此,在导入时,这将起作用,因为它会禁用提取大小。

    sqoop import --driver com.vertica.Driver --connect jdbc:vertica://[host]:[port]/[db] --username [username] --password [pass] -m 1 --table [table] --fetch-size=0
    

    但是,导出仍然不起作用,出现同样的错误。没有用于导出的--fetch-size 选项,因此解决此问题的唯一方法是为 Sqoop 编写一个 Vertica 连接管理器。

    连接管理器很简单:

    public class VerticaManager extends GenericJdbcManager {
    
        // driver class to ensure is loaded when making db connection.
        private static final String DRIVER_CLASS = "com.vertica.Driver";
    
        protected static final int DEFAULT_FETCH_SIZE = 0;
    
        public VerticaManager(SqoopOptions opts) {
            super(DRIVER_CLASS, opts);
        }
    
        protected void initOptionDefaults() {
            if (options.getFetchSize() == null) {
                // Vertica JDBC does not support fetch size, so we default to 0
                LOG.info("Using default fetchSize of " + DEFAULT_FETCH_SIZE);
                options.setFetchSize(DEFAULT_FETCH_SIZE);
            }
        }
    }
    

    它强制获取大小为 0,并为我们设置驱动程序。

    所以在运行 sqoop 时,我们现在使用这个:

    sqoop [command] --connection-manger com.example.sqoop.manager.VerticaManager ...
    

    这样,所有命令似乎都可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多