2016-05-25 4 views
0

У меня проблема с несколькими вставками через odbc Impala (последняя версия).Драйвер Impala ODBC для множественной вставки

Я пытаюсь вставить две тысячи строк в таблице Impala (на Cloudera) с 4-мя колоннами, но я получаю две ошибки:

[Cloudera] [SQLEngine] (31580) Длина заявления превышает максимальная: 16384. [Cloudera] [ImpalaODBC] (110) ошибка при выполнении запроса в Impala: [HY000]: AnalysisException: Синтаксическая ошибка в строке 1: ...

Я использую запрос параметризованных запрос:

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

Теперь мой вопрос:

Есть ли способ вставить миллионы строк с помощью драйвера odbc без использования отдельных вставок?

спасибо.

ответ

0

В настоящий момент для запроса имеется максимум 16384 символов, что должно быть похоже на гораздо более высокий предел. В настоящее время мы изучаем, есть ли причина для этого низкого предела.

Тем не менее, более эффективный способ вставки нескольких значений через ODBC будет использовать запрос:

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

, а затем использовать связывание для связывания нескольких наборов параметров в параметры массива. Таким образом, драйвер может оптимизировать выполнение внутри, и вы не выполняете ограничение длины запроса. Вы уже пробовали это?

+0

Только в сторону, предстоящий выпуск драйвера увеличит предел до практических ограничений, поддерживаемых Impala. – KylePorter

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(); 

В конце концов, моя таблица состоит только из одной записи со значениями Первые четыре параметра.

В коде отсутствует что-то неправильное?

Спасибо.

+0

Вы, к сожалению, используете поставщик ADO.NET для ODBC (оболочка C# над ODBC), которая ограничивает возможности взаимодействия с ODBC API. Как написано, вы просто добавляете в список кучу значений, а затем устанавливаете диапазон для всего набора для ваших 4 параметров, не используя несколько наборов из 4. Пробовали ли вы https://msdn.microsoft.com/en -us/library/aadf8fk2% 28v = vs.110% 29.aspx вместо этого? – KylePorter

+0

Я попытался использовать OdbcDataAdapter, но odbc выполняет один оператор insert для каждой новой строки в моем DataTable с плохой производительностью. Некоторые советы или примеры для моей проблемы? – marley1990

+0

К сожалению, если поставщик ADO.NET для ODBC преобразует это в неоптимальное выполнение на уровне ODBC, вам не повезло. Предел в 16384 символа был удален и выйдет в следующей версии драйвера, однако я не уверен, когда это станет для вас всеобщим. Я бы об этом подумал. – KylePorter

Смежные вопросы