如何通过Impala ODBC批量插入?

时间:2018-12-27 17:24:33

标签: 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, 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();
    }
}

插入一行,但是应该插入5行。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

.ExecuteNonQuery()调用需要在内部 for (....)循环中……..另一方面,用于 create 的代码参数必须位于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();
        }
    }
}