|spconnect|向けのJDBCデータソースの設定

このセクションでは、Snowpark ConnectのJDBCデータソース機能を使用して、外部データベースからデータを読み取り、外部データベース(MySQLやPostgreSQLなど)にデータを書き込むためのガイドとサンプルコードを提供します。クライアント側とSnowflake Notebook両方の設定について説明します。

パート1:クライアント側の設定(MySQL)

この設定は、PythonスクリプトやIDEなどのローカルクライアントアプリケーションからSnowpark Connectを実行する場合に必要です。

前提条件

  1. Java Runtime Environment(JRE)/ Java Development Kit(JDK):

    • JREまたはJDKをインストールします。Javaインストールのアーキテクチャ(たとえば64ビット)は、Pythonインストールのアーキテクチャと一致している**必要があります**。

    • インストールのソース例:`Adoptium Temurin リリース<https://adoptium.net/temurin/releases/?version=11>`__(Java 11を使用している場合)。

  2. ``JAVA_HOME``環境変数の設定:

    • Javaインストールのルートディレクトリを指すように``JAVA_HOME``環境変数を構成します。

    • 例(macOS/Linux):

export JAVA_HOME=/path/to/your/jdk/home
  1. ``CLASSPATH``環境変数の設定:

    • 特定のデータベースのJDBCドライバー``.jar``ファイルへのパスを``CLASSPATH``環境変数に追加します。これにより、Java環境は必要なドライバーを見つけることができます。

    • 例(MySQLドライバーの場合):

export CLASSPATH=$CLASSPATH:/path/to/your/driver/mysql-connector-j-9.2.0.jar

サンプルクライアントコード(MySQLからの読み取り)

この例は、``spark_session.read.jdbc()``を使用してMySQLデータベースからテーブルを読み取る方法を示しています。

from pyspark.sql import Row

# Adjust the URL for your server host, port, and database name
MYSQL_JDBC_URL = "jdbc:mysql://localhost/test_db"

# Ensure this driver name matches your version of the JDBC driver
MYSQL_JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"

def test_jdbc_read_from_mysql(self, spark_session):
    # This code snippet uses the Snowpark Connect Spark session
    jdbc_df = spark_session.read.jdbc(
        MYSQL_JDBC_URL,
        "my_schema.my_table",  # Specify your table name in MySQL
        properties={
            "user": "root",           # Your MySQL user name
            "password": "****",       # Your password for MySQL
            "driver": MYSQL_JDBC_DRIVER,
        },
    ).collect()

    # After reading via JDBC, the data is loaded into a temporary table in Snowflake.
    # You can now perform any standard DataFrame operations supported by Snowpark Connect.

サンプルクライアントコード(MySQLへの書き込み)

この例は、``spark_session.write.jdbc()``を使用してMySQLデータベースにデータを書き込む方法を示しています。

from pyspark.sql import Row

# Adjust the URL for your server host, port, and database name
MYSQL_JDBC_URL = "jdbc:mysql://localhost/test_db"

# Ensure this driver name matches your version of the JDBC driver
MYSQL_JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"

def test_jdbc_write_overwrite_to_mysql(self, spark_session):
    # This code snippet uses the Snowpark Connect Spark session
    jdbc_df = spark_session.createDataFrame(
        [
            Row(a=1, b=2.0, c="test1"),
            Row(a=2, b=3.0, c="test2"),
            Row(a=4, b=5.0, c="test3"),
        ]
    )

    jdbc_df.write.jdbc(
        MYSQL_JDBC_URL,
        "my_schema.my_table2",  # Specify your table name in MySQL
        mode="overwrite",
        properties={
            "user": "root",        # Your MySQL user name
            "password": "****",    # Your password for MySQL
            "driver": MYSQL_JDBC_DRIVER,
        },
    )

パート2:SnowflakeウェアハウスNotebookの設定(PostgreSQL)

この設定は、Snowflake Notebook環境内でSnowpark Connectを直接実行する場合に使用されます。

設定手順

  • ``snowpark-connect``パッケージの追加:

    • ``snowflake-snowpark-connect``パッケージがノートブック環境に追加されていることを確認します。

Snowflake Notebookへのsnowflake-snowpark-connectパッケージの追加
  • JDBCドライバーのダウンロードとアップロード:

  • 外部統合(ネットワークルールと統合)のアクティブ化:

    • Snowflakeでは、ノートブックが外部ネットワークロケーションと通信できるようにするために、**外部アクセス統合**が必要です。外部データベースのホストとポートに対して、**ネットワークルール**を定義する必要があります。

Snowflake Notebookでのネットワークルール設定の構成
Snowflake NotebookへのJDBCドライバーJARファイルのアップロード
-- 1. Create a Network Rule for the external database host and port
CREATE OR REPLACE NETWORK RULE JDBC_READ_NETWORK_RULE
  MODE = EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('hh-pgsql-public.ebi.ac.uk:5432'); -- REPLACE with your host:port

-- 2. Create the External Access Integration using the new Network Rule
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION JDBC_READ_ACCESS_INTEGRATION
  ALLOWED_NETWORK_RULES = (JDBC_READ_NETWORK_RULE)
  ENABLED = true;

-- NOTE: This integration must be referenced/activated within your notebook's settings.

サンプルウェアハウスNotebookコード(PostgreSQLからの読み取り)

この例は、セッションを初期化し、ドライバーをロードして、PostgreSQLからデータを読み取るために必要なPythonコードを示しています。

from snowflake import snowpark_connect
import jpype

# Initialize the Spark session for Snowpark Connect
spark = snowpark_connect.server.init_spark_session()
df = spark.sql("show schemas").limit(2)
df.show()

# Add the uploaded JDBC driver JAR to the Java Classpath using jpype
# Adjust the path to match the name of the JAR file you uploaded
jpype.addClassPath('/tmp/appRoot/postgresql-42.7.8.jar')

# Using public PostgreSQL DB as an example: https://rnacentral.org/help/public-database
jdbc_df = spark.read.jdbc(
    # Adjust this URL as per your server host, port, and database
    "jdbc:postgresql://hh-pgsql-public.ebi.ac.uk:5432/pfmegrnargs",
    "",  # Empty string for table name when providing a custom query
    properties={
        "user": "reader",                # Your PostgreSQL user name
        "password": "***",               # Your password for PostgreSQL
        "driver": "org.postgresql.Driver",
        # Use the "query" property for a custom SQL statement
        "query": """SELECT
  upi,     -- RNAcentral URS identifier
  taxid,   -- NCBI taxid
  ac       -- external accession
FROM xref
WHERE ac IN ('OTTHUMT00000106564.1', 'OTTHUMT00000416802.1')"""
    },
)

jdbc_df.show()

サンプルウェアハウスNotebookコード(PostgreSQLへの書き込み)

この例は、セッションを初期化し、ドライバーをロードして、PostgreSQLにデータを書き込むために必要なPythonコードを示しています。

from snowflake import snowpark_connect
from pyspark.sql import Row
import jpype

# Initialize the Spark session for Snowpark Connect
spark = snowpark_connect.server.init_spark_session()
df = spark.sql("show schemas").limit(2)
df.show()

# Add the uploaded JDBC driver JAR to the Java Classpath using jpype
# Adjust the path to match the name of the JAR file you uploaded
jpype.addClassPath('/tmp/appRoot/postgresql-42.7.8.jar')

# Create dataframe
jdbc_df = spark.createDataFrame(
    [
        Row(a=1, b=2.0, c="test1"),
        Row(a=2, b=3.0, c="test2"),
        Row(a=4, b=5.0, c="test3"),
    ]
)

# Using public PostgreSQL DB as an example: https://rnacentral.org/help/public-database
jdbc_df.write.jdbc(
    # Adjust this URL as per your server host, port, and database
    "jdbc:postgresql://hh-pgsql-public.ebi.ac.uk:5432/pfmegrnargs",
    "public.my_table2",  # Specify your table name in PostgreSQL
    mode="overwrite",
    properties={
        "user": "writer",                # Your PostgreSQL user name
        "password": "***",               # Your password for PostgreSQL
        "driver": "org.postgresql.Driver",
    },
)

パート3:Snowflake Workspace Notebookの設定(PostgreSQL)

この設定は、Snowflake Workspace Notebook環境内でSnowpark Connectを直接実行する場合に使用されます。

設定手順

  • ``snowpark-connect``パッケージはデフォルトでWorkspace Notebookに含まれています。

  • JDBCドライバーのダウンロードとアップロード:

Snowflake Workspace NotebookでのJDBCドライバーのアップロード
  • 外部統合の作成:

-- 1. Create a Network Rule for the external database host and port
CREATE OR REPLACE NETWORK RULE JDBC_READ_NETWORK_RULE
  MODE = EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('hh-pgsql-public.ebi.ac.uk:5432'); -- REPLACE with your host:port

-- 2. Create the External Access Integration using the new Network Rule
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION JDBC_READ_ACCESS_INTEGRATION
  ALLOWED_NETWORK_RULES = (JDBC_READ_NETWORK_RULE)
  ENABLED = true;

-- NOTE: This integration must be referenced/activated within your notebook's settings.
  • 外部統合(ネットワークルールと統合)のアクティブ化:

    • Snowflakeでは、ノートブックが外部ネットワークロケーションと通信できるようにするために、**外部アクセス統合**が必要です。外部データベースのホストとポートに対して、**ネットワークルール**を定義する必要があります。

    Workspace Notebook設定での外部アクセス統合のアクティブ化

サンプルWorkspace Notebookコード(PostgreSQLからの読み取り)

この例は、セッションを初期化し、ドライバーをロードして、PostgreSQLからデータを読み取るために必要なPythonコードを示しています。

from snowflake import snowpark_connect
import jpype
import os

# Initialize the Spark session for Snowpark Connect
spark = snowpark_connect.server.init_spark_session()
df = spark.sql("show schemas").limit(2)
df.show()

# Add the uploaded JDBC driver JAR to the Java Classpath using jpype
# Adjust the path to match the name of the JAR file you uploaded
# Copy the driver to /tmp directory
os.system("cp ./postgresql-42.7.8.jar /tmp/postgresql-42.7.8.jar")
jpype.addClassPath('/tmp/postgresql-42.7.8.jar')

# Using public PostgreSQL DB as an example: https://rnacentral.org/help/public-database
jdbc_df = spark.read.jdbc(
    # Adjust this URL as per your server host, port, and database
    "jdbc:postgresql://hh-pgsql-public.ebi.ac.uk:5432/pfmegrnargs",
    "",  # Empty string for table name when providing a custom query
    properties={
        "user": "reader",                # Your PostgreSQL user name
        "password": "***",               # Your password for PostgreSQL
        "driver": "org.postgresql.Driver",
        # Use the "query" property for a custom SQL statement
        "query": """SELECT
  upi,     -- RNAcentral URS identifier
  taxid,   -- NCBI taxid
  ac       -- external accession
FROM xref
WHERE ac IN ('OTTHUMT00000106564.1', 'OTTHUMT00000416802.1')"""
    },
)

jdbc_df.show()

サンプルWorkspace Notebookコード(PostgreSQLへの書き込み)

この例は、セッションを初期化し、ドライバーをロードして、PostgreSQLにデータを書き込むために必要なPythonコードを示しています。

from snowflake import snowpark_connect
from pyspark.sql import Row
import jpype
import os

# Initialize the Spark session for Snowpark Connect
spark = snowpark_connect.server.init_spark_session()
df = spark.sql("show schemas").limit(2)
df.show()

# Add the uploaded JDBC driver JAR to the Java Classpath using jpype
# Adjust the path to match the name of the JAR file you uploaded
# Copy the driver to /tmp directory
os.system("cp ./postgresql-42.7.8.jar /tmp/postgresql-42.7.8.jar")
jpype.addClassPath('/tmp/postgresql-42.7.8.jar')

# Create dataframe
jdbc_df = spark.createDataFrame(
    [
        Row(a=1, b=2.0, c="test1"),
        Row(a=2, b=3.0, c="test2"),
        Row(a=4, b=5.0, c="test3"),
    ]
)

# Using public PostgreSQL DB as an example: https://rnacentral.org/help/public-database
jdbc_df.write.jdbc(
    # Adjust this URL as per your server host, port, and database
    "jdbc:postgresql://hh-pgsql-public.ebi.ac.uk:5432/pfmegrnargs",
    "public.my_table2",  # Specify your table name in PostgreSQL
    mode="overwrite",
    properties={
        "user": "writer",                # Your PostgreSQL user name
        "password": "***",               # Your password for PostgreSQL
        "driver": "org.postgresql.Driver",
    },
)

サポートされているデータソース

  • SQL サーバー

  • MySQL

  • PostgreSQL