即使在批处理执行模式下,Netezza批量插入也非常慢

时间:2017-07-20 16:25:53

标签: jdbc netezza

我指的是这个文档。 http://www-01.ibm.com/support/docview.wss?uid=swg21981328。根据文章,如果我们使用executeBatch方法,那么插入将更快(Netezza JDBC驱动程序可能检测到批量插入,并在底层将其转换为外部表加载,外部表加载将更快)。我不得不执行数百万个插入语句,每个连接最多只能达到每分钟500条记录的速度。有没有更好的方法通过jdbc连接更快地加载数据到netezza?我使用spark和jdbc连接来插入记录。为什么即使我正在批量执行,也不会发生通过加载的外部表。下面给出的是我正在使用的火花代码,

Dataset<String> insertQueryDataSet.foreachPartition( partition -> {                 
    Connection conn = NetezzaConnector.getSingletonConnection(url, userName, pwd);
    conn.setAutoCommit(false);
    int commitBatchCount = 0;
    int insertBatchCount = 0;
    Statement statement = conn.createStatement();
    //PreparedStatement preparedStmt  = null;
    while(partition.hasNext()){
        insertBatchCount++;             
        //preparedStmt = conn.prepareStatement(partition.next());
        statement.addBatch(partition.next());
        //statement.addBatch(partition.next());
        commitBatchCount++;
        if(insertBatchCount % 10000 == 0){
            LOGGER.info("Before executeBatch.");                            
            int[] execCount = statement.executeBatch();
            LOGGER.info("After execCount." + execCount.length);                     
            LOGGER.info("Before commit.");
            conn.commit();                          
            LOGGER.info("After commit.");                                                   
        }                       
    }
    //execute remaining statements
    statement.executeBatch();
    int[] execCount = statement.executeBatch();
    LOGGER.info("After execCount." + execCount.length);
    conn.commit();          
    conn.close();

}); 

1 个答案:

答案 0 :(得分:1)

我试过这种方法(批量插入)但发现很慢, 所以我将所有数据都放在CSV&amp;为每个csv做外部表加载。

def first_longer_than_second(first, second)
  first.length >= second.length
end

因为我使用java所以JDBC作为源和&amp;请注意,csv文件路径是单引号。 希望这可以帮助。 如果您发现比这种方法更好,请不要忘记发帖。 :)