Connessioni JDBC - AWS Glue

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Connessioni JDBC

Alcuni tipi di database, tipicamente relazionali, supportano la connessione tramite lo JDBC standard. Per ulteriori informazioni in meritoJDBC, consultate la JDBC API documentazione Java. AWS Glue supporta nativamente la connessione a determinati database tramite i relativi JDBC connettori: le JDBC librerie sono fornite nei job AWS Glue Spark. Quando ci si connette a questi tipi di database utilizzando le librerie do AWS Glue, si ha accesso a un set standard di opzioni.

I JDBC connectionType valori includono quanto segue:

  • "connectionType": "sqlserver": indica una connessione a un database di Microsoft SQL Server.

  • "connectionType": "mysql": Indica una connessione a un database MySQL.

  • "connectionType": "oracle": designa una connessione a un database Oracle.

  • "connectionType": "postgresql": Indica una connessione a un database SQL Postgre.

  • "connectionType": "redshift": designa una connessione a un database Amazon Redshift. Per ulteriori informazioni, consulta Connessioni Redshift.

La tabella seguente elenca le versioni dei JDBC driver supportate da AWS Glue.

Product JDBCversioni dei driver per Glue 5.0 JDBCversioni dei driver per Glue 4.0 JDBCversioni dei driver per Glue 3.0 JDBCversioni dei driver per Glue 0.9, 1.0, 2.0
Microsoft SQL Server 10.2.0 9,40 7.x 6.x
Mio SQL 8.0.33 8.0.23 8.0.23 5.1
Oracle Database 23,3,023,09 21,7 21,1 11.2
Poster SQL 42.7.3 42,36 4,2,18 42.1.x
Amazon Redshift* redshift-jdbc42-2.1.0.29 redshift-jdbc42-2.1.0.16 redshift-jdbc41-1.2.12.1017 redshift-jdbc41-1.2.12.1017

* Per il tipo di connessione Amazon Redshift, tutte le altre coppie nome/valore dell'opzione incluse nelle opzioni di connessione per una JDBC connessione, incluse le opzioni di formattazione, vengono passate direttamente allo Spark sottostante. SQL DataSource Nei lavori AWS Glue with Spark in AWS Glue 4.0 e versioni successive, il connettore nativo AWS Glue per Amazon Redshift utilizza l'integrazione Amazon Redshift per Apache Spark. Per ulteriori informazioni, consulta la pagina Integrazione di Amazon Redshift per Apache Spark. Nelle versioni precedenti, consulta la sezione Amazon Redshift data source for Spark.

Per configurare Amazon VPC per la connessione agli Amazon RDS Data Store utilizzandoJDBC, consultaConfigurazione di Amazon VPC per connessioni JDBC agli archivi dati Amazon RDS da AWS Glue.

Nota

AWS I Glue job vengono associati solo a una sottorete durante un'esecuzione. Ciò potrebbe influire sulla capacità di connettersi a più origini dati tramite lo stesso processo. Questo comportamento non è limitato alle JDBC fonti.

JDBCriferimento alle opzioni di connessione

Se hai già definito una connessione JDBC AWS Glue, puoi riutilizzare le proprietà di configurazione in essa definite, come: url, user e password; in questo modo non devi specificarle nel codice come opzioni di connessione. Questa funzionalità è disponibile in AWS Glue 3.0 e versioni successive. A tale scopo, utilizza le seguenti proprietà di connessione:

  • "useConnectionProperties": impostalo su "true" per indicare che desideri utilizzare la configurazione da una connessione.

  • "connectionName": inserisci il nome della connessione da cui recuperare la configurazione; la connessione deve essere definita nella stessa regione del processo.

Usa queste opzioni di connessione con JDBC le connessioni:

  • "url": (Obbligatorio) Il JDBC URL per il database.

  • "dbtable": (obbligatorio) la tabella database da cui leggere. Per gli archivi JDBC dati che supportano gli schemi all'interno di un database, specificareschema.table-name. Se non viene fornito alcuno schema, viene usato lo schema "pubblico" predefinito.

  • "user": (obbligatorio) Il nome utente da usare per la connessione.

  • "password": (obbligatorio) la password da usare per la connessione.

  • (Facoltativo) Le seguenti opzioni consentono di fornire un JDBC driver personalizzato. Usa queste opzioni se devi usare un driver che AWS Glue non supporta nativamente.

    ETLjobs può utilizzare versioni di JDBC driver diverse per l'origine e la destinazione dei dati, anche se l'origine e la destinazione sono lo stesso prodotto di database. In questo modo è possibile eseguire la migrazione dei dati tra database di origine e di destinazione con versioni diverse. Per utilizzare queste opzioni, devi prima caricare il JAR file del JDBC driver su Amazon S3.

    • "customJdbcDriverS3Path": il percorso Amazon S3 del driver personalizzatoJDBC.

    • "customJdbcDriverClassName": il nome della classe del JDBC driver.

  • "bulkSize": (Facoltativo) Utilizzato per configurare inserti paralleli per velocizzare i carichi alla rinfusa verso gli obiettivi. JDBC Specifica un valore intero per il grado di parallelismo da utilizzare durante la scrittura o l'inserimento di dati. Questa opzione è utile per migliorare le prestazioni delle scritture in database come Arch User Repository (). AUR

  • "hashfield"(Facoltativo) Una stringa, utilizzata per specificare il nome di una colonna nella JDBC tabella da utilizzare per dividere i dati in partizioni durante la lettura da JDBC tabelle in parallelo. Fornisci "hashfield" O "hashexpression". Per ulteriori informazioni, consulta Lettura in parallelo dalle tabelle JDBC.

  • "hashexpression"(Facoltativo) Una clausola SQL select che restituisce un numero intero. Utilizzato per dividere i dati di una JDBC tabella in partizioni durante la lettura da JDBC tabelle in parallelo. Fornisci "hashfield" O "hashexpression". Per ulteriori informazioni, consulta Lettura in parallelo dalle tabelle JDBC.

  • "hashpartitions": (facoltativo) un numero intero positivo. Utilizzato per specificare il numero di letture parallele della JDBC tabella durante la lettura da JDBC tabelle in parallelo. Impostazione predefinita: 7. Per ulteriori informazioni, consulta Lettura in parallelo dalle tabelle JDBC.

  • "sampleQuery": (Facoltativo) Un'istruzione di SQL interrogazione personalizzata. Utilizzata per specificare un sottoinsieme di informazioni in una tabella per recuperare un campione del contenuto della tabella. Se configurata indipendentemente dai dati, può essere meno efficiente dei DynamicFrame metodi e causare timeout o errori di esaurimento della memoria. Per ulteriori informazioni, consulta Utilizzare sampleQuery.

  • "enablePartitioningForSampleQuery": (facoltativo) un valore booleano. Valore predefinito: false. Utilizzato per abilitare la lettura da JDBC tabelle in parallelo durante la specificazione. sampleQuery Se impostato su true, sampleQuery deve terminare con «where» o «and» affinché AWS Glue aggiunga le condizioni di partizionamento. Per ulteriori informazioni, consulta Utilizzare sampleQuery.

  • "sampleSize": (facoltativo) un numero intero positivo. Limita il numero di righe restituite dalla query di esempio. Funziona solo quando enablePartitioningForSampleQuery è true. Se il partizionamento non è abilitato, è invece necessario aggiungere direttamente "limit x" nella sampleQuery per limitare le dimensioni. Per ulteriori informazioni, consulta Utilizzare sampleQuery.

Utilizzare sampleQuery

Questa sezione illustra come utilizzare sampleQuery, sampleSize e enablePartitioningForSampleQuery.

sampleQuery può essere un modo efficace per campionare alcune righe del set di dati. Per impostazione predefinita, la query viene eseguita da un singolo esecutore. Se configurato indipendentemente dai dati, può essere meno efficiente dei DynamicFrame metodi e causare timeout o errori di esaurimento della memoria. L'esecuzione SQL sul database sottostante come parte della ETL pipeline è generalmente necessaria solo per motivi di prestazioni. Se stai cercando di visualizzare in anteprima alcune righe del tuo set di dati, prendi in considerazione l'utilizzo di show. Se stai cercando di trasformare il tuo set di dati utilizzando un moduloSQL, valuta la possibilità di utilizzare toDF per definire una SQL trasformazione Spark rispetto ai dati in un modulo. DataFrame

Anche se la query può manipolare diverse tabelle, dbtable resta obbligatoria.

sampleQuery Usalo per recuperare un campione della tua tabella

Quando si utilizza sampleQuery il comportamento predefinito per recuperare un campione dei dati, AWS Glue non prevede un throughput sostanziale, quindi esegue la query su un singolo esecutore. Per limitare i dati forniti e non causare problemi di prestazioni, ti consigliamo di inserire una SQL clausola. LIMIT

Esempio Utilizzare sampleQuery senza partizionamento

Il codice di esempio seguente mostra come utilizzare sampleQuery senza partizionamento.

//A full sql query statement. val query = "select name from $tableName where age > 0 limit 1" val connectionOptions = JsonOptions(Map( "url" -> url, "dbtable" -> tableName, "user" -> user, "password" -> password, "sampleQuery" -> query )) val dyf = glueContext.getSource("mysql", connectionOptions) .getDynamicFrame()

Utilizzo su set di dati più sampleQuery grandi

Se stai leggendo un set di dati di grandi dimensioni, potresti dover abilitare il JDBC partizionamento per interrogare una tabella in parallelo. Per ulteriori informazioni, consulta Lettura in parallelo dalle tabelle JDBC. Per utilizzarlo sampleQuery con il JDBC partizionamento, imposta su true. enablePartitioningForSampleQuery L'attivazione di questa funzionalità richiede di apportare alcune modifiche alla sampleQuery.

Quando si utilizza il JDBC partizionamento consampleQuery, la query deve terminare con «where» o «and» affinché AWS Glue aggiunga le condizioni di partizionamento.

Se desideri limitare i risultati della lettura da JDBC tabelle in parallelo, imposta il "sampleSize" parametro anziché specificare una LIMIT clausola. sampleQuery

Esempio Utilizzare sampleQuery con il partizionamento JDBC

Il seguente esempio di codice mostra come utilizzare sampleQuery con JDBC il partizionamento.

//note that the query should end with "where" or "and" if use with JDBC partitioning. val query = "select name from $tableName where age > 0 and" //Enable JDBC partitioning by setting hashfield. //to use sampleQuery with partitioning, set enablePartitioningForSampleQuery. //use sampleSize to limit the size of returned data. val connectionOptions = JsonOptions(Map( "url" -> url, "dbtable" -> tableName, "user" -> user, "password" -> password, "hashfield" -> primaryKey, "sampleQuery" -> query, "enablePartitioningForSampleQuery" -> true, "sampleSize" -> "1" )) val dyf = glueContext.getSource("mysql", connectionOptions) .getDynamicFrame()

Note e restrizioni:

Le query di esempio non possono essere utilizzate insieme ai segnalibri del processo. Lo stato del segnalibro verrà ignorato quando viene fornita la configurazione per entrambi.

Usa un driver personalizzato JDBC

I seguenti esempi di codice mostrano come leggere e scrivere su JDBC database con JDBC driver personalizzati. Essi dimostrano la lettura da una versione di un prodotto di database e la scrittura a una versione successiva dello stesso prodotto.

Python
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext, SparkConf from awsglue.context import GlueContext from awsglue.job import Job import time from pyspark.sql.types import StructType, StructField, IntegerType, StringType sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # Construct JDBC connection options connection_mysql5_options = { "url": "jdbc:mysql://<jdbc-host-name>:3306/db", "dbtable": "test", "user": "admin", "password": "pwd"} connection_mysql8_options = { "url": "jdbc:mysql://<jdbc-host-name>:3306/db", "dbtable": "test", "user": "admin", "password": "pwd", "customJdbcDriverS3Path": "s3://DOC-EXAMPLE-BUCKET/mysql-connector-java-8.0.17.jar", "customJdbcDriverClassName": "com.mysql.cj.jdbc.Driver"} connection_oracle11_options = { "url": "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL", "dbtable": "test", "user": "admin", "password": "pwd"} connection_oracle18_options = { "url": "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL", "dbtable": "test", "user": "admin", "password": "pwd", "customJdbcDriverS3Path": "s3://DOC-EXAMPLE-BUCKET/ojdbc10.jar", "customJdbcDriverClassName": "oracle.jdbc.OracleDriver"} # Read from JDBC databases with custom driver df_mysql8 = glueContext.create_dynamic_frame.from_options(connection_type="mysql", connection_options=connection_mysql8_options) # Read DynamicFrame from MySQL 5 and write to MySQL 8 df_mysql5 = glueContext.create_dynamic_frame.from_options(connection_type="mysql", connection_options=connection_mysql5_options) glueContext.write_from_options(frame_or_dfc=df_mysql5, connection_type="mysql", connection_options=connection_mysql8_options) # Read DynamicFrame from Oracle 11 and write to Oracle 18 df_oracle11 = glueContext.create_dynamic_frame.from_options(connection_type="oracle", connection_options=connection_oracle11_options) glueContext.write_from_options(frame_or_dfc=df_oracle11, connection_type="oracle", connection_options=connection_oracle18_options)
Scala
import com.amazonaws.services.glue.GlueContext import com.amazonaws.services.glue.MappingSpec import com.amazonaws.services.glue.errors.CallSite import com.amazonaws.services.glue.util.GlueArgParser import com.amazonaws.services.glue.util.Job import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.DynamicFrame import org.apache.spark.SparkContext import scala.collection.JavaConverters._ object GlueApp { val MYSQL_5_URI: String = "jdbc:mysql://<jdbc-host-name>:3306/db" val MYSQL_8_URI: String = "jdbc:mysql://<jdbc-host-name>:3306/db" val ORACLE_11_URI: String = "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL" val ORACLE_18_URI: String = "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL" // Construct JDBC connection options lazy val mysql5JsonOption = jsonOptions(MYSQL_5_URI) lazy val mysql8JsonOption = customJDBCDriverJsonOptions(MYSQL_8_URI, "s3://DOC-EXAMPLE-BUCKET/mysql-connector-java-8.0.17.jar", "com.mysql.cj.jdbc.Driver") lazy val oracle11JsonOption = jsonOptions(ORACLE_11_URI) lazy val oracle18JsonOption = customJDBCDriverJsonOptions(ORACLE_18_URI, "s3://DOC-EXAMPLE-BUCKET/ojdbc10.jar", "oracle.jdbc.OracleDriver") def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) Job.init(args("JOB_NAME"), glueContext, args.asJava) // Read from JDBC database with custom driver val df_mysql8: DynamicFrame = glueContext.getSource("mysql", mysql8JsonOption).getDynamicFrame() // Read DynamicFrame from MySQL 5 and write to MySQL 8 val df_mysql5: DynamicFrame = glueContext.getSource("mysql", mysql5JsonOption).getDynamicFrame() glueContext.getSink("mysql", mysql8JsonOption).writeDynamicFrame(df_mysql5) // Read DynamicFrame from Oracle 11 and write to Oracle 18 val df_oracle11: DynamicFrame = glueContext.getSource("oracle", oracle11JsonOption).getDynamicFrame() glueContext.getSink("oracle", oracle18JsonOption).writeDynamicFrame(df_oracle11) Job.commit() } private def jsonOptions(url: String): JsonOptions = { new JsonOptions( s"""{"url": "${url}", |"dbtable":"test", |"user": "admin", |"password": "pwd"}""".stripMargin) } private def customJDBCDriverJsonOptions(url: String, customJdbcDriverS3Path: String, customJdbcDriverClassName: String): JsonOptions = { new JsonOptions( s"""{"url": "${url}", |"dbtable":"test", |"user": "admin", |"password": "pwd", |"customJdbcDriverS3Path": "${customJdbcDriverS3Path}", |"customJdbcDriverClassName" : "${customJdbcDriverClassName}"}""".stripMargin) } }