2017-07-20 21 views
1

私はこのドキュメントを参照しています。 http://www-01.ibm.com/support/docview.wss?uid=swg21981328。記事では、executeBatchメソッドを使用すると、挿入が高速になります(Netezza JDBCドライバがバッチ挿入を検出して、これを外部テーブルのロードに変換し、外部テーブルのロードを高速化します)。私は何百万もの挿入ステートメントを実行しなければならず、コネクションごとに1分あたり500レコードの速度しか得ていません。 jdbc接続を介してNetezzaにデータをより高速にロードする方法はありますか?私はレコードを挿入するためにスパークとjdbc接続を使用しています。私がバッチで実行しているときでも、ロードによる外部テーブルは起こっていません。下記の私は、だから私はCSV &内のすべてのデータは、各CSVのための外部表のロードを行う入れる(バッチ挿入)このアプローチを試みたが、非常に遅い見つけ、 私は、バッチ実行モードでもNetezzaバッチ挿入が非常に遅い

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(); 

}); 

答えて

0

を使用しています火花コードです。私は元&ノートとしてJDBCので、Javaを使用していたので

InsertReq="Insert into "+ tablename + " select * from external '"+ filepath + "' using (maxerrors 0, delimiter ',' unase 2000 encoding 'internal' remotesource 'jdbc' escapechar '\')"; 
Jdbctemplate.execute(InsertReq); 

csvファイル・パスは、単一引用符で囲まれていること。 これが役立つことを願っています。 この方法よりも優れている場合は、投稿することを忘れないでください。 :)

関連する問題