用于多个插入的Impala ODBC驱动程序

时间:2016-05-25 10:42:00

标签: odbc driver impala

我通过odbc Impala(最新版本)有多个插入问题。

我试图在Impala表中(在Cloudera上)插入两千行,但是我收到两个错误:

  

[Cloudera] [SQLEngine](31580)语句的长度超过最大值:16384。   [Cloudera] [ImpalaODBC](110)在Impala中执行查询时出错:[HY000]:AnalysisException:第1行中的语法错误:...

我使用查询参数化查询:

INSERT INTO name_table (a,b,c,d) VALUES (?,?,?,?) , (?,?,?,?) , ....

现在我的问题是:

有没有办法在不使用单个插入的情况下使用odbc驱动程序插入数百万行?

谢谢。

2 个答案:

答案 0 :(得分:0)

目前,查询最多有16384个字符,这应该是看起来更高的限制。我们目前正在调查是否存在这种下限的原因。

也就是说,通过ODBC插入多个值的更有效方法是使用查询:

INSERT INTO name_table (a,b,c,d) VALUES (?,?,?,?)

然后使用数组绑定将多个参数集绑定到您的参数。通过这种方式,驱动程序可以在内部优化执行,并且不会遇到查询长度限制。你有没试过这个?

答案 1 :(得分:0)

我已经尝试执行以下代码:

        OdbcCommand oComm = oConn.CreateCommand();

        StringBuilder sb = new StringBuilder();


        sb.AppendFormat("INSERT INTO {0}.{1} (a,b,c,d) VALUES (?,?,?,?)", dbName, tableName);



        List<OdbcParameter> psl = new List<OdbcParameter>(1000 * 4);

        for (int i = 0; i < 1000; i++)
        {

            var odbcParameter = new OdbcParameter();
            odbcParameter.ParameterName = "@a";
            odbcParameter.OdbcType = OdbcType.Text;
            odbcParameter.Value ="a"+i;
            psl.Add(odbcParameter);

            odbcParameter = new OdbcParameter();
            odbcParameter.ParameterName = "@b";
            odbcParameter.OdbcType = OdbcType.Text;
            odbcParameter.Value = "b" + i;
            psl.Add(odbcParameter);

            odbcParameter = new OdbcParameter();
            odbcParameter.ParameterName = "@c";
            odbcParameter.OdbcType = OdbcType.Text;
            odbcParameter.Value = "c" + i;
            psl.Add(odbcParameter);

            odbcParameter = new OdbcParameter();
            odbcParameter.ParameterName = "@d";
            odbcParameter.Value = "d" + i;
            odbcParameter.OdbcType = OdbcType.Text;
            psl.Add(odbcParameter);


        }


        oComm.Parameters.AddRange(psl.ToArray());

        oComm.CommandText = sb.ToString();

        oComm.executeNonQUery();

最后,我的表只由一个带有前四个参数值的记录组成。

我的代码有问题吗?

感谢。