C# 如何通过Impala ODBC批量插入?
我一直在通过ODBC从Impala查询和插入数据,但速度很慢(至少与Postgres或SQL Server相比),ODBC驱动程序可以逐个执行查询,这是绝对不推荐的,因为每次插入都会在HDFS中创建一个新文件 我阅读了Simba站点和Cloudera站点上提供的ODBC文档,但未提及批处理操作或直接SQL执行 这是我到目前为止试过的代码C# 如何通过Impala ODBC批量插入?,c#,odbc,impala,C#,Odbc,Impala,我一直在通过ODBC从Impala查询和插入数据,但速度很慢(至少与Postgres或SQL Server相比),ODBC驱动程序可以逐个执行查询,这是绝对不推荐的,因为每次插入都会在HDFS中创建一个新文件 我阅读了Simba站点和Cloudera站点上提供的ODBC文档,但未提及批处理操作或直接SQL执行 这是我到目前为止试过的代码 static void Main(string[] args) { string insert = $"INSERT INTO tbl(version,
static void Main(string[] args)
{
string insert = $"INSERT INTO tbl(version, snapshot) " +
$"VALUES(?, ?)";
OdbcConnection connection = new OdbcConnection("DSN=connection");
connection.Open();
using (OdbcCommand insertCommand = new OdbcCommand(insert, connection))
{
for (int i = 10; i < 15; i++)
{
List<OdbcParameter> parameters = new List<OdbcParameter>();
OdbcParameter versionParam = new OdbcParameter("@version", OdbcType.Text);
versionParam.Value = "bla" + i;
parameters.Add(versionParam);
OdbcParameter snapshotParam = new OdbcParameter("@snapshot", OdbcType.Text);
snapshotParam.Value = "blabla" + i;
parameters.Add(snapshotParam);
insertCommand.Parameters.AddRange(parameters.ToArray());
}
string query = insertCommand.CommandText.ToString();
Console.WriteLine(query);
//insertCommand.ExecuteReader();
insertCommand.ExecuteNonQuery();
}
}
static void Main(字符串[]args)
{
字符串插入=$“插入到tbl(版本,快照)”+
$“值(?,)”;
ODBC连接=新的ODBC连接(“DSN=连接”);
connection.Open();
使用(OdbcCommand insertCommand=新OdbcCommand(插入,连接))
{
对于(int i=10;i<15;i++)
{
列表参数=新列表();
OdbcParameter versionParam=新的OdbcParameter(“@version”,OdbcType.Text);
versionParam.Value=“bla”+i;
参数。添加(versionParam);
OdbcParameter snapshotParam=新的OdbcParameter(“@snapshot”,OdbcType.Text);
快照参数Value=“blabla”+i;
参数。添加(snapshotParam);
insertCommand.Parameters.AddRange(Parameters.ToArray());
}
string query=insertCommand.CommandText.ToString();
Console.WriteLine(查询);
//insertCommand.ExecuteReader();
insertCommand.ExecuteOnQuery();
}
}
插入一行,但应插入5行。我做错了什么?调用.ExecuteNonQuery()
需要在for(…)
循环中调用。。。。。另一方面,创建参数的代码必须在for()
循环之外,在循环内部,您应该只设置参数的值,而不是一次又一次地重复创建它们
请尝试以下代码:
static void Main(string[] args)
{
string insert = $"INSERT INTO tbl(version, snapshot) VALUES(?, ?)";
OdbcConnection connection = new OdbcConnection("DSN=connection");
connection.Open();
using (OdbcCommand insertCommand = new OdbcCommand(insert, connection))
{
// *create* the parameters *outside* the "for" loop - only once!
List<OdbcParameter> parameters = new List<OdbcParameter>();
OdbcParameter versionParam = new OdbcParameter("@version", OdbcType.Text);
parameters.Add(versionParam);
OdbcParameter snapshotParam = new OdbcParameter("@snapshot", OdbcType.Text);
parameters.Add(snapshotParam);
insertCommand.Parameters.AddRange(parameters.ToArray());
for (int i = 10; i < 15; i++)
{
// inside the "for" loop - only set the values of the parameters
versionParam.Value = "bla" + i;
snapshotParam.Value = "blabla" + i;
// ... and then *execute* the query to run the insert!
string query = insertCommand.CommandText.ToString();
Console.WriteLine(query);
insertCommand.ExecuteNonQuery();
}
}
}
static void Main(字符串[]args)
{
字符串插入=$“插入tbl(版本,快照)值(?,)”;
ODBC连接=新的ODBC连接(“DSN=连接”);
connection.Open();
使用(OdbcCommand insertCommand=新OdbcCommand(插入,连接))
{
//*在“for”循环外创建*参数*一次!
列表参数=新列表();
OdbcParameter versionParam=新的OdbcParameter(“@version”,OdbcType.Text);
参数。添加(versionParam);
OdbcParameter snapshotParam=新的OdbcParameter(“@snapshot”,OdbcType.Text);
参数。添加(snapshotParam);
insertCommand.Parameters.AddRange(Parameters.ToArray());
对于(int i=10;i<15;i++)
{
//在“for”循环内-仅设置参数值
versionParam.Value=“bla”+i;
快照参数Value=“blabla”+i;
//…然后*执行*查询以运行插入!
string query=insertCommand.CommandText.ToString();
Console.WriteLine(查询);
insertCommand.ExecuteOnQuery();
}
}
}
调用.ExecuteNonQuery()
需要位于(…)的循环中。。。。。另一方面,创建参数的代码必须在for()
循环之外,在循环内部,您应该只设置参数的值,而不是一次又一次地重复创建它们
请尝试以下代码:
static void Main(string[] args)
{
string insert = $"INSERT INTO tbl(version, snapshot) VALUES(?, ?)";
OdbcConnection connection = new OdbcConnection("DSN=connection");
connection.Open();
using (OdbcCommand insertCommand = new OdbcCommand(insert, connection))
{
// *create* the parameters *outside* the "for" loop - only once!
List<OdbcParameter> parameters = new List<OdbcParameter>();
OdbcParameter versionParam = new OdbcParameter("@version", OdbcType.Text);
parameters.Add(versionParam);
OdbcParameter snapshotParam = new OdbcParameter("@snapshot", OdbcType.Text);
parameters.Add(snapshotParam);
insertCommand.Parameters.AddRange(parameters.ToArray());
for (int i = 10; i < 15; i++)
{
// inside the "for" loop - only set the values of the parameters
versionParam.Value = "bla" + i;
snapshotParam.Value = "blabla" + i;
// ... and then *execute* the query to run the insert!
string query = insertCommand.CommandText.ToString();
Console.WriteLine(query);
insertCommand.ExecuteNonQuery();
}
}
}
static void Main(字符串[]args)
{
字符串插入=$“插入tbl(版本,快照)值(?,)”;
ODBC连接=新的ODBC连接(“DSN=连接”);
connection.Open();
使用(OdbcCommand insertCommand=新OdbcCommand(插入,连接))
{
//*在“for”循环外创建*参数*一次!
列表参数=新列表();
OdbcParameter versionParam=新的OdbcParameter(“@version”,OdbcType.Text);
参数。添加(versionParam);
OdbcParameter snapshotParam=新的OdbcParameter(“@snapshot”,OdbcType.Text);
参数。添加(snapshotParam);
insertCommand.Parameters.AddRange(Parameters.ToArray());
对于(int i=10;i<15;i++)
{
//在“for”循环内-仅设置参数值
versionParam.Value=“bla”+i;
快照参数Value=“blabla”+i;
//…然后*执行*查询以运行插入!
string query=insertCommand.CommandText.ToString();
Console.WriteLine(查询);
insertCommand.ExecuteOnQuery();
}
}
}
谢谢,非常感谢。这段代码仍然会创建多个插入,对吗?但是,它比我的代码快至少3倍。谢谢,我真的很感激。这段代码仍然会创建多个插入,对吗?但是,它比我的代码快至少3倍。