Невозможно использовать подготовленный оператор для вставки данных в многораздельную таблицу - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь вставить данные в секционированную таблицу impala, используя подготовленные Java-операторы.Вставка работает хорошо с не разделенными, но я получаю ошибку с разделенными таблицами.

Мне нужно проверить разницу в производительности между секционированными и не секционированными. Мне кажется, лучше всего использовать подготовленные операторы для соединения.


create_query = "CREATE TABLE IF NOT EXISTS tbl_raw_flow_v9 (source_ip string,destination_ip string,protocol_number int,) partitioned by (year int) stored as parquet";

    private static final String sqlCompiledQuery = "INSERT INTO tbl_raw_flow_v9 (source_ip,destination_ip,protocol_number" +
            "PARTITION (year) VALUES (?,?,?,?)";


    private static Connection connectViaDS() throws Exception {
        Connection connection = null;

        Class.forName("com.cloudera.impala.jdbc41.Driver");

        connection = DriverManager.getConnection(CONNECTION_URL);

        return connection;

    }


# my try block

try {
            connection = connectViaDS();

            connection.setAutoCommit(false);

            preparedStatement = connection.prepareStatement(sqlCompiledQuery);

            while(counter <total) {

                for (int index = 1; index <= records; index++) {

                    counter++;

                    preparedStatement.setString(1, "s_ip" + String.valueOf(index));

                    preparedStatement.setString(2, "d_ip" + String.valueOf(index));

                    preparedStatement.setInt(3, protocol_no + index);

                    preparedStatement.setInt(4, yr + flag);

                    preparedStatement.addBatch();

                }
                preparedStatement.executeBatch();

                preparedStatement.clearBatch();

                connection.commit();

                System.out.println("Counter = "+counter);

                flag++;


            }

        } 

Я не знаю, делаю ли я ошибкув использовании готового заявления или есть что-то еще.Я могу вставить значение в таблицу разделов, используя

"INSERT INTO tbl_raw_flow_v9 (source_ip,destination_ip,protocol_number) PARTITION (year) VALUES ("s_ip","d_ip",234,2010);

Когда я использую предоплатную выписку, я получаю следующую ошибку в java-

java.sql.SQLException: [Simba][JDBC](11420) Error, parameter metadata not populated.
    at com.cloudera.exceptions.ExceptionConverter.toSQLException(Unknown Source)
    at com.cloudera.jdbc.common.SPreparedStatement.<init>(Unknown Source)
    at com.cloudera.jdbc.common4.C4SPreparedStatement.<init>(Unknown Source)
    at com.cloudera.jdbc.jdbc41.S41PreparedStatement.<init>(Unknown Source)
    at com.cloudera.jdbc.jdbc41.JDBC41ObjectFactory.createPreparedStatement(Unknown Source)
    at com.cloudera.impala.jdbc41.ImpalaJDBC41ObjectFactory.createPreparedStatement(Unknown Source)
    at com.cloudera.jdbc.common.SConnection.prepareStatement(Unknown Source)
    at impala_test.writeInABatchWithCompiledQuery(impala_test.java:100)
    at impala_test.main(impala_test.java:52)

Было бы очень полезно, если кто-то может пролить светна этом.

...