2016-05-25 21 views
0

Ich habe ein Problem mit mehreren Einfügungen über odbc Impala (letzte Version).Impala ODBC-Treiber für mehrere Einfügen

Ich versuche, zweitausend Zeilen in einer Impala-Tabelle einzufügen (auf Cloudera) mit 4 Spalten, aber ich erhalte zwei Fehler:

[Cloudera] [SQLEngine] (31580) Die Länge der Aussage überschreitet das Maximum: 16384 [Cloudera] [ImpalaODBC] (110) Fehler beim Ausführen einer Abfrage in Impala Ausführung: [HY000]: AnalysisException: Syntaxfehler in Zeile 1: ...

ich verwende Abfrage parametrisiert Abfrage:

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

Jetzt ist meine Frage:

Gibt es eine Möglichkeit, Millionen von Zeilen mit dem ODBC-Treiber ohne einzelne Einsätze einfügen?

Vielen Dank.

Antwort

0

Im Moment gibt es maximal 16384 Zeichen für eine Abfrage, die wie eine viel höhere Grenze aussehen sollte. Wir untersuchen derzeit, ob es einen Grund für dieses niedrige Limit gibt.

Das heißt, eine effizientere Möglichkeit, mehrere Werte über ODBC des Einfügens zu verwenden, wäre die Abfrage:

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

und verwenden Sie dann Array Bindung mehrere Parametersätze auf Ihre Parameter zu binden. Auf diese Weise kann der Treiber die Ausführung intern optimieren, und Sie stoßen nicht auf eine Abfragelängenbeschränkung. Hast du das schon probiert?

+0

Nur eine Seite, eine bevorstehende Freigabe des Treibers wird die Grenze zu den praktischen Grenzen, die von Impala unterstützt werden, erhöhen. – KylePorter

0

hatte ich schon versucht, den folgenden Code auszuführen:

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

Am Ende meine Tabelle besteht aus nur einem Datensatz mit den ersten vier Parameterwerten.

Es ist etwas falsch in meinem Code?

Danke.

+0

Sie verwenden leider den ADO.NET-Provider für ODBC (ein C# -Wrapper über ODBC), der die Interaktion mit der ODBC-API begrenzt. Wie beschrieben, fügen Sie einfach eine Reihe von Werten zu einer Liste hinzu und legen dann den Bereich auf den gesamten Satz für Ihre 4 Parameter fest, ohne mehrere Sätze von 4 zu verwenden. Haben Sie https://msdn.microsoft.com/de versucht -us/library/aadf8fk2% 28v = vs.110% 29.aspx stattdessen? – KylePorter

+0

Ich habe versucht, OdbcDataAdapter zu verwenden, aber die ODBC führt eine Insert-Anweisung für jede neue Zeile in meiner DataTable mit schlechter Leistung aus. Ein Rat oder ein Beispiel für mein Problem? – marley1990

+0

Wenn der ADO.NET-Provider für ODBC dies in eine nicht optimale Ausführung auf der ODBC-Ebene transformiert, haben Sie leider kein Glück. Das Limit von 16384 Zeichen wurde entfernt und wird in der nächsten Version des Treibers verschwinden, aber ich bin mir nicht sicher, wann dies für Sie öffentlich werden wird. Ich würde Cloudera darüber aufklären. – KylePorter