Configuração de fontes de dados JDBC para Snowpark Connect for Spark

Esta seção fornece um guia e um código de amostra para ler dados de bancos de dados externos e gravar dados em bancos de dados externos (como MySQL e PostgreSQL) usando o recurso de fonte de dados JDBC para Snowpark Connect. Ela aborda a configuração tanto do notebook Snowflake quanto do lado do cliente.

Parte 1: Configuração do lado do cliente (MySQL)

Essa configuração é necessária ao executar o Snowpark Connect de um aplicativo cliente local, como um script ou IDE Python.

Pré-requisitos

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

    • Instale um JRE ou JDK. A arquitetura (por exemplo, 64 bits) da instalação Java deve corresponder à arquitetura da instalação Python.

    • Exemplo de fonte para instalação: Versões do Adoptium Temurin (se usar Java 11).

  2. Definir a variável de ambiente ``JAVA_HOME``:

    • Configure a variável de ambiente JAVA_HOME para apontar para o diretório raiz da instalação Java.

    • Exemplo (macOS/Linux):

export JAVA_HOME=/path/to/your/jdk/home
  1. Definir a variável de ambiente ``CLASSPATH``:

    • Adicione o caminho para o arquivo .jar do driver JDBC do seu banco de dados específico à variável de ambiente CLASSPATH. Isso permite que o ambiente Java encontre o driver necessário.

    • Exemplo (para driver MySQL):

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

Código do cliente de amostra (ler do MySQL)

Este exemplo demonstra como ler uma tabela de um banco de dados MySQL usando spark_session.read.jdbc().

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.

Código do cliente de amostra (gravar no MySQL)

Este exemplo demonstra como gravar dados em um banco de dados MySQL usando spark_session.write.jdbc().

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,
        },
    )

Parte 2: Configuração do notebook do warehouse Snowflake (PostgreSQL)

Essa configuração é usada ao executar o Snowpark Connect diretamente em um ambiente de notebook Snowflake.

Etapas de configuração

  • Adicionar o pacote ``snowpark-connect``:

    • Garanta que o pacote snowflake-snowpark-connect seja adicionado ao seu ambiente de notebook.

Adicionando o pacote snowflake-snowpark-connect ao notebook Snowflake
  • Baixar e carregar o driver JDBC:

    • Baixe o arquivo .jar do driver JDBC adequado ao seu banco de dados externo (por exemplo, driver JDBC do PostgreSQL).

    • Carregue o arquivo .jar baixado diretamente em seu ambiente de notebook.

  • Ativar integrações externas (regra de rede e integração):

    • O Snowflake requer uma integração de acesso externo para permitir que o notebook se comunique com locais de rede externos. Você deve definir uma regra de rede para o host e a porta do seu banco de dados externo.

Configurando as regras de rede no notebook Snowflake
Carregando o arquivo JAR do driver JDBC no notebook Snowflake
-- 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.

Código do notebook do warehouse de amostra (ler do PostgreSQL)

Este exemplo mostra o código Python necessário para inicializar a sessão, carregar o driver e ler dados do PostgreSQL.

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

Código do notebook do warehouse de amostra (gravar no PostgreSQL)

Este exemplo mostra o código Python necessário para inicializar a sessão, carregar o driver e gravar dados no PostgreSQL.

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",
    },
)

Parte 3: Configuração do notebook do espaço de trabalho Snowflake (PostgreSQL)

Essa configuração é usada ao executar o Snowpark Connect diretamente em um ambiente de notebook do espaço de trabalho Snowflake.

Etapas de configuração

  • Por padrão, o pacote snowpark-connect está incluído no notebook do espaço de trabalho.

  • Baixar e carregar o driver JDBC:

    • Baixe o arquivo .jar do driver JDBC adequado ao seu banco de dados externo (por exemplo, driver JDBC do PostgreSQL).

    • Carregue o arquivo .jar baixado diretamente em seu ambiente de notebook.

Carregando o driver JDBC no notebook do espaço de trabalho Snowflake
  • Criar a integração externa:

-- 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.
  • Ativar integrações externas (regra de rede e integração):

    • O Snowflake requer uma integração de acesso externo para permitir que o notebook se comunique com locais de rede externos. Você deve definir uma regra de rede para o host e a porta do seu banco de dados externo.

    Ativando a integração de acesso externo nas configurações do notebook do espaço de trabalho

Código do notebook do espaço de trabalho de amostra (ler do PostgreSQL)

Este exemplo mostra o código Python necessário para inicializar a sessão, carregar o driver e ler dados do PostgreSQL.

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

Código do notebook do espaço de trabalho de amostra (gravar no PostgreSQL)

Este exemplo mostra o código Python necessário para inicializar a sessão, carregar o driver e gravar dados no PostgreSQL.

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",
    },
)

Fontes de dados compatíveis

  • SQL Server

  • MySQL

  • PostgreSQL