C# 如何通过Impala ODBC批量插入?

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,

我一直在通过ODBC从Impala查询和插入数据,但速度很慢(至少与Postgres或SQL Server相比),ODBC驱动程序可以逐个执行查询,这是绝对不推荐的,因为每次插入都会在HDFS中创建一个新文件

我阅读了Simba站点和Cloudera站点上提供的ODBC文档,但未提及批处理操作或直接SQL执行

这是我到目前为止试过的代码

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倍。