Javaのプログラムを使用してRedshiftのクラスターに接続する方法です。
Amazon Redshift JDBC ドライバーをダウンロード
Java から Redshift へ接続するには JDBC ドライバが必要です。 JDBC 接続を設定する - Amazon Redshift からダウンロードしてクラスパスに追加してください。Maven リポジトリには登録されていませんでした。
Redshift クラスターに接続する
クラスターへの接続プログラムは以下のようになります。
import java.sql.*; import java.util.Properties; public class RedshiftSample { public static void main(String[] args) { String jdbcURL = "jdbc:redshift://xxxxx.xxxxx.redshift.amazonaws.com:5439/devdb"; String user = "hoge"; String password = "fuga1234"; Properties prop = new Properties(); prop.setProperty("user", user); prop.setProperty("password", password); try (Connection con = DriverManager.getConnection(jdbcURL, prop); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from information_schema.tables;")) { while (rs.next()) { String catalog = rs.getString("table_catalog"); String name = rs.getString("table_name"); System.out.println("Catalog: " + catalog + ", Name: " + name); } } catch (SQLException e) { e.printStackTrace(); } } }
上記の例では Java7 以降のスタンダードなコーティングスタイルとなった try-with-resources 文を使用していますが、 その場合は JDBC 4.1 のドライバーを使用してください。
try-with-resources構文について - TASK NOTES
クラスターにプログラムで接続する - Amazon RedshiftM
JDBCフェッチサイズパラメータ
Redshift を使用するということは、大きなデータセットを取得する場合も多々あると思います。その際にメモリ不足エラーが発生する可能性がありますのでバッチで結果セットを取得できるように、JDBC フェッチサイズパラメータをプログラム側で設定するようにしましょう。フェッチサイズが低いとその分結果を取得する回数も増えて、実行時間が長くなりますので適切な値を設定します。
try (Connection con = DriverManager.getConnection(jdbcURL, prop); Statement st = con.createStatement()) { st.setFetchSize(10000); try (ResultSet rs = st.executeQuery("select * from information_schema.tables;")) { while (rs.next()) { String catalog = rs.getString("table_catalog"); String name = rs.getString("table_name"); System.out.println("Catalog: " + catalog + ", Name: " + name); } }
クエリのトラブルシューティング - Amazon Redshift
プログラムの実行エラー
Redshift に接続するプログラムの実行時に以下のエラーが発生したのでメモとして残しておきます。
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:284) at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:238) ...
jar のパッケージングの際に以下を除外することで直りました。
exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF'
java - "Invalid signature file" when attempting to run a .jar - Stack Overflow