我通过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驱动程序插入数百万行?
谢谢。
答案 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();
最后,我的表只由一个带有前四个参数值的记录组成。
我的代码有问题吗?
感谢。