Как сделать пакетные вставки через Impala ODBC? - PullRequest
0 голосов
/ 27 декабря 2018

Я запрашивал и вставлял данные из Impala и в Impala через ODBC, но он медленный (по крайней мере, по сравнению с Postgres или SQL Server), и драйвер ODBC позволяет выполнять запросы один за другим, что абсолютно не рекомендуется, посколькукаждая вставка создает новый файл в HDFS.

Я читаю документы ODBC, доступные на сайте Simba и Cloudera, но пакетные операции или прямое выполнение 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 голосов
/ 27 декабря 2018

Вызов .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();
        }
    }
}
...