用于多次插入的impala odbc驱动程序

sauutmhj  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(484)

我在通过odbc impala(最新版本)进行多个插入时遇到问题。
我试图在一个有4列的impala表(在cloudera上)中插入2000行,但收到两个错误:
[cloudera][sqlengine](31580)语句长度超过最大值:16384[cloudera][impalaodbc](110)在impala:[hy000]中执行查询时出错:analysisexception:第1行出现语法错误:。。。
我正在使用查询参数化查询:

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

现在我的问题是:
有没有一种方法可以使用odbc驱动程序插入数百万行而不使用单个插入?
谢谢您。

cbjzeqam

cbjzeqam1#

目前,一个查询最多有16384个字符,这看起来应该是一个更高的限制。我们目前正在调查,看看这个下限是否有原因。
也就是说,通过odbc插入多个值的更有效方法是使用查询: INSERT INTO name_table (a,b,c,d) VALUES (?,?,?,?) 然后使用数组绑定将多个参数集绑定到您的参数。这样,驱动程序就可以在内部优化执行,而不会遇到查询长度限制。你已经试过这个了吗?

piwo6bdm

piwo6bdm2#

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

  1. OdbcCommand oComm = oConn.CreateCommand();
  2. StringBuilder sb = new StringBuilder();
  3. sb.AppendFormat("INSERT INTO {0}.{1} (a,b,c,d) VALUES (?,?,?,?)", dbName, tableName);
  4. List<OdbcParameter> psl = new List<OdbcParameter>(1000 * 4);
  5. for (int i = 0; i < 1000; i++)
  6. {
  7. var odbcParameter = new OdbcParameter();
  8. odbcParameter.ParameterName = "@a";
  9. odbcParameter.OdbcType = OdbcType.Text;
  10. odbcParameter.Value ="a"+i;
  11. psl.Add(odbcParameter);
  12. odbcParameter = new OdbcParameter();
  13. odbcParameter.ParameterName = "@b";
  14. odbcParameter.OdbcType = OdbcType.Text;
  15. odbcParameter.Value = "b" + i;
  16. psl.Add(odbcParameter);
  17. odbcParameter = new OdbcParameter();
  18. odbcParameter.ParameterName = "@c";
  19. odbcParameter.OdbcType = OdbcType.Text;
  20. odbcParameter.Value = "c" + i;
  21. psl.Add(odbcParameter);
  22. odbcParameter = new OdbcParameter();
  23. odbcParameter.ParameterName = "@d";
  24. odbcParameter.Value = "d" + i;
  25. odbcParameter.OdbcType = OdbcType.Text;
  26. psl.Add(odbcParameter);
  27. }
  28. oComm.Parameters.AddRange(psl.ToArray());
  29. oComm.CommandText = sb.ToString();
  30. oComm.executeNonQUery();

最后,我的表只由一条记录和前四个参数值组成。
我的代码有问题吗?
谢谢。

展开查看全部

相关问题