

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Jenis dan opsi koneksi untuk ETL AWS Glue untuk Spark
<a name="aws-glue-programming-etl-connect"></a>

Dalam AWS Glue untuk Spark, berbagai PySpark dan metode Scala dan transformasi menentukan jenis koneksi menggunakan parameter. `connectionType` Mereka menentukan pilihan koneksi menggunakan parameter `connectionOptions` atau `options`.

Parameter `connectionType` dapat mengambil nilai yang ditunjukkan dalam tabel berikut. Nilai parameter `connectionOptions` (atau `options`) untuk setiap jenis didokumentasikan di bagian berikut. Kecuali jika dinyatakan lain, parameter berlaku saat koneksi digunakan sebagai sumber atau sink.

Untuk kode contoh yang menunjukkan pengaturan dan menggunakan opsi koneksi, lihat beranda untuk setiap jenis koneksi.


| `connectionType` | Terhubung ke | 
| --- | --- | 
| [dinamodb](aws-glue-programming-etl-connect-dynamodb-home.md) | Basis data [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/) | 
| [kinesis](aws-glue-programming-etl-connect-kinesis-home.md) | [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/streams/latest/dev/introduction.html) | 
| [s3](aws-glue-programming-etl-connect-s3-home.md) | [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/) | 
| [documentdb](aws-glue-programming-etl-connect-documentdb-home.md#aws-glue-programming-etl-connect-documentdb) | Basis data [Amazon DocumentDB (dengan kompatibilitas MongoDB)](https://docs.aws.amazon.com/documentdb/latest/developerguide/) | 
| [pencarian terbuka](aws-glue-programming-etl-connect-opensearch-home.md) | [ OpenSearch Layanan Amazon](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/). | 
| [pergeseran merah](aws-glue-programming-etl-connect-redshift-home.md) | [Basis data Amazon Redshift](https://aws.amazon.com/redshift/) | 
| [kafka](aws-glue-programming-etl-connect-kafka-home.md) |  [Kafka](https://kafka.apache.org/) atau [Amazon Managed Streaming for Apache Kafka](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html) | 
| [azurecosmos](aws-glue-programming-etl-connect-azurecosmos-home.md) | Azure Cosmos untuk NoSQL. | 
| [azuresql](aws-glue-programming-etl-connect-azuresql-home.md) | SQL Azure. | 
| [bigquery](aws-glue-programming-etl-connect-bigquery-home.md) | Google BigQuery. | 
| [mongodb](aws-glue-programming-etl-connect-mongodb-home.md) | [Database MongoDB](https://www.mongodb.com/what-is-mongodb), termasuk MongoDB Atlas. | 
| [sqlserver](aws-glue-programming-etl-connect-jdbc-home.md) |  Basis data Microsoft SQL Server (lihat [Koneksi JDBC](aws-glue-programming-etl-connect-jdbc-home.md)) | 
| [mysql](aws-glue-programming-etl-connect-jdbc-home.md) | Basis data [MySQL](https://www.mysql.com/) (lihat [Koneksi JDBC](aws-glue-programming-etl-connect-jdbc-home.md)) | 
| [oracle](aws-glue-programming-etl-connect-jdbc-home.md) | Basis data [Oracle](https://www.oracle.com/database/) (lihat [Koneksi JDBC](aws-glue-programming-etl-connect-jdbc-home.md)) | 
| [postgresql](aws-glue-programming-etl-connect-jdbc-home.md) |  Basis data [PostgreSQL](https://www.postgresql.org/) (lihat [Koneksi JDBC](aws-glue-programming-etl-connect-jdbc-home.md)) | 
| [saphana](aws-glue-programming-etl-connect-saphana-home.md) | GETAH HANA. | 
| [kepingan salju](aws-glue-programming-etl-connect-snowflake-home.md) | [Danau data kepingan salju](https://www.snowflake.com/) | 
| [teradata](aws-glue-programming-etl-connect-teradata-home.md) | Teradata Vantage. | 
| [vertica](aws-glue-programming-etl-connect-vertica-home.md) | Vertika. | 
| [kebiasaan. ](#aws-glue-programming-etl-connect-market)\* | Penyimpanan data Spark, Athena, atau JDBC (lihat [Nilai kustom dan AWS Marketplace ConnectionType](#aws-glue-programming-etl-connect-market)  | 
| [pasar. ](#aws-glue-programming-etl-connect-market)\* | Penyimpanan data Spark, Athena, atau JDBC (lihat [Nilai kustom dan AWS Marketplace ConnectionType](#aws-glue-programming-etl-connect-market))  | 

## DataFrame opsi untuk ETL di AWS Glue 5.0 untuk Spark
<a name="aws-glue-programming-etl-connect-dataframe"></a>

A DataFrame adalah Dataset yang disusun ke dalam kolom bernama mirip dengan tabel dan mendukung operasi gaya fungsional (map/reduce/filter/etc.) dan operasi SQL (pilih, proyek, agregat).

 DataFrame Untuk membuat sumber data yang didukung oleh Glue, berikut ini diperlukan:
+ konektor sumber data `ClassName`
+ koneksi sumber data `Options`

Demikian pula, untuk menulis DataFrame ke data sink yang didukung oleh Glue, hal yang sama diperlukan:
+ konektor wastafel data `ClassName`
+ koneksi data sink `Options`

Perhatikan bahwa fitur AWS Glue seperti bookmark pekerjaan dan DynamicFrame opsi seperti tidak `connectionName` didukung. DataFrame Untuk detail selengkapnya tentang DataFrame dan operasi yang didukung, lihat dokumentasi Spark untuk [DataFrame](https://spark.apache.org/docs/3.5.2/api/python/reference/pyspark.sql/dataframe.html).

### Menentukan konektor ClassName
<a name="aws-glue-programming-etl-connect-dataframe-classname"></a>

Untuk menentukan `ClassName` data source/sink, gunakan `.format` opsi untuk menyediakan konektor yang sesuai `ClassName` yang mendefinisikan data source/sink.

**Konektor JDBC**  
Untuk konektor JDBC, tentukan `jdbc` sebagai nilai `.format` opsi dan berikan driver `ClassName` JDBC dalam opsi. `driver`

```
df = spark.read.format("jdbc").option("driver", "<DATA SOURCE JDBC DRIVER CLASSNAME>")...

df.write.format("jdbc").option("driver", "<DATA SINK JDBC DRIVER CLASSNAME>")...
```

Tabel berikut mencantumkan driver JDBC `ClassName` dari sumber data yang didukung di AWS Glue for. DataFrames

| Sumber data | Pengemudi ClassName | 
| --- |--- |
| PostgreSQL | org.PostgreSQL.driver | 
| Oracle | oracle.jdbc.driver. OracleDriver | 
| SQLServer | com.microsoft.sqlserver.jdbc. SQLServerDriver | 
| MySQL | com.mysql.jdbc.driver | 
| SapHana | com.sap.db.jdbc.driver | 
| Teradata | com.teradata.jdbc. TeraDriver | 

**Konektor percikan**  
Untuk konektor percikan, tentukan konektor sebagai nilai `.format` opsi. `ClassName`

```
df = spark.read.format("<DATA SOURCE CONNECTOR CLASSNAME>")...

df.write.format("<DATA SINK CONNECTOR CLASSNAME>")...
```

Tabel berikut mencantumkan konektor Spark `ClassName` dari sumber data yang didukung di AWS Glue for DataFrames.

| Sumber data | ClassName | 
| --- |--- |
| MongoDB/DocumentDB | lem.spark.mongodb | 
| Redshift | io.github.spark\_redshift\_community.spark.redshift | 
| AzureCosmos | kosmos.oltp | 
| AzureSQL | com.microsoft.sqlserver.jdbc.spark | 
| BigQuery | com.google.cloud.spark.bigquery | 
| OpenSearch | org.opensearch.spark.sql | 
| Kepingan salju | net.snowflake.spark.snowflake | 
| Vertica | com.vertica.spark.sumber data. VerticaSource | 

### Menentukan Opsi koneksi
<a name="aws-glue-programming-etl-connect-dataframe-connection-options"></a>

Untuk menentukan `Options` koneksi ke data source/sink, gunakan `.option(<KEY>, <VALUE>)` untuk menyediakan opsi individual atau `.options(<MAP>)` untuk menyediakan beberapa opsi sebagai peta nilai kunci.

Setiap data source/sink mendukung rangkaian koneksinya sendiri`Options`. Untuk detail tentang yang tersedia`Options`, lihat dokumentasi publik dari konektor source/sink Spark data spesifik yang tercantum dalam tabel berikut.
+ [JDBC](https://spark.apache.org/docs/3.5.2/sql-data-sources-jdbc.html)
+ [MongoDB/DocumentDB](https://www.mongodb.com/docs/spark-connector/v10.4/)
+ [Pergeseran Merah](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html)
+ [AzureCosmos](https://github.com/Azure/azure-cosmosdb-spark)
+ [AzuresQL](https://learn.microsoft.com/en-us/sql/connect/spark/connector?view=sql-server-ver16)
+ [BigQuery](https://cloud.google.com/dataproc/docs/tutorials/bigquery-connector-spark-example)
+ [OpenSearch](https://github.com/opensearch-project/opensearch-hadoop/blob/main/USER_GUIDE.md#apache-spark)
+ [Kepingan salju](https://docs.snowflake.com/en/user-guide/spark-connector-use#setting-configuration-options-for-the-connector)
+ [Vertica](https://github.com/vertica/spark-connector)

### Contoh
<a name="aws-glue-programming-etl-connect-dataframe-examples"></a>

Contoh berikut dibaca dari PostgreSQL dan menulis ke: SnowFlake

**Python**  
Contoh:

```
from awsglue.context import GlueContext
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

dataSourceClassName = "jdbc"
dataSourceOptions = {
  "driver": "org.postgresql.Driver",
  "url": "<url>",
  "user": "<user>",
  "password": "<password>",
  "dbtable": "<dbtable>",
}

dataframe = spark.read.format(className).options(**options).load()

dataSinkClassName = "net.snowflake.spark.snowflake"
dataSinkOptions = {
  "sfUrl": "<url>",
  "sfUsername": "<username>",
  "sfPassword": "<password>",
  "sfDatabase" -> "<database>",                              
  "sfSchema" -> "<schema>",                       
  "sfWarehouse" -> "<warehouse>"  
}

dataframe.write.format(dataSinkClassName).options(**dataSinkOptions).save()
```

**Skala**  
Contoh:

```
import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder().getOrCreate()

val dataSourceClassName = "jdbc"
val dataSourceOptions = Map(
  "driver" -> "org.postgresql.Driver",
  "url" -> "<url>",
  "user" -> "<user>",
  "password" -> "<password>",
  "dbtable" -> "<dbtable>"
)

val dataframe = spark.read.format(dataSourceClassName).options(dataSourceOptions).load()

val dataSinkClassName = "net.snowflake.spark.snowflake"
val dataSinkOptions = Map(
  "sfUrl" -> "<url>",
  "sfUsername" -> "<username>",
  "sfPassword" -> "<password>",
  "sfDatabase" -> "<database>",
  "sfSchema" -> "<schema>",
  "sfWarehouse" -> "<warehouse>"
)

dataframe.write.format(dataSinkClassName).options(dataSinkOptions).save()
```

## Nilai kustom dan AWS Marketplace ConnectionType
<a name="aws-glue-programming-etl-connect-market"></a>

Sumber daya yang dimaksud meliputi:
+ `"connectionType": "marketplace.athena"`: Mengkhususkan koneksi ke penyimpanan data Amazon Athena. Koneksi menggunakan konektor dari AWS Marketplace.
+ `"connectionType": "marketplace.spark"`: Mengkhususkan koneksi ke Penyimpanan data Apache Spark. Koneksi menggunakan konektor dari AWS Marketplace.
+ `"connectionType": "marketplace.jdbc"`: Mengkhususkan koneksi ke Penyimpanan data JDBC. Koneksi menggunakan konektor dari AWS Marketplace.
+ `"connectionType": "custom.athena"`: Mengkhususkan koneksi ke penyimpanan data Amazon Athena. Koneksi menggunakan konektor khusus yang Anda unggahAWS Glue Studio.
+ `"connectionType": "custom.spark"`: Mengkhususkan koneksi ke Penyimpanan data Apache Spark. Koneksi menggunakan konektor khusus yang Anda unggahAWS Glue Studio.
+ `"connectionType": "custom.jdbc"`: Mengkhususkan koneksi ke Penyimpanan data JDBC. Koneksi menggunakan konektor khusus yang Anda unggahAWS Glue Studio.

### Pilihan koneksi untuk jenis custom.jdbc atau marketplace.jdbc
<a name="marketplace-jdbc-connect-options"></a>
+ `className`— String, diperlukan, nama kelas Java yang sepenuhnya memenuhi syarat dari driver JDBC (misalnya,). `com.mysql.cj.jdbc.Driver` Anda harus menentukan opsi ini saat menggunakan konektor khusus atau AWS Marketplace JDBC. Jika Anda menghilangkan opsi ini, pekerjaan mungkin gagal dengan `No suitable driver` kesalahan, terutama saat menggunakan URL JDBC berparameter.
+ `connectionName` — String, wajib, nama koneksi yang dikaitkan dengan konektor.
+ `url` — String, wajib, URL JDBC dengan placeholder (`${}`) yang digunakan untuk membangun koneksi ke sumber data. Placeholder `${secretKey}` diganti dengan rahasia dari nama yang sama di AWS Secrets Manager. Lihat dokumentasi penyimpanan data untuk informasi lebih lanjut tentang cara membangun URL. 
+ `secretId` atau `user/password` — String, wajib, yang digunakan untuk mengambil kredensial untuk URL. 
+ `dbTable` atau `query` — String, wajib, tabel atau kueri SQL tempat untuk mendapatkan data. Anda dapat menentukan salah satu dari `dbTable` atau `query`, bukan keduanya. 
+ `partitionColumn` — String, opsional, nama kolom integer yang digunakan untuk pemartisian. Opsi ini bekerja hanya ketika ia disertakan dengan `lowerBound`, `upperBound`, dan `numPartitions`. Pilihan ini bekerja dengan cara yang sama seperti pada pembaca Spark SQL JDBC. Untuk informasi selengkapnya, lihat [JDBC Ke Database Lain](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html) di *Apache Spark SQL*, dan Panduan Datasets. DataFrames

  Nilai `lowerBound` dan `upperBound` digunakan untuk menentukan langkah partisi, bukan untuk menyaring baris dalam tabel. Semua baris dalam tabel dipartisi dan dikembalikan. 
**catatan**  
Bila menggunakan sebuah kueri bukan nama sebuah tabel, maka Anda harus memvalidasi bahwa kueri bekerja dengan syarat pemartisian yang ditentukan. Contoh:   
Jika format kueri Anda adalah `"SELECT col1 FROM table1"`, maka uji kueri dengan menambahkan klausul `WHERE` pada akhir kueri yang menggunakan kolom partisi. 
Jika format kueri Anda adalah "`SELECT col1 FROM table1 WHERE col2=val"`, maka uji kueri dengan memperluas klausul `WHERE` dengan `AND` dan ekspresi yang menggunakan kolom partisi.
+ `lowerBound` — Integer, opsional, nilai minimum `partitionColumn` yang digunakan untuk memutuskan langkah partisi. 
+ `upperBound` — Integer, opsional, nilai maksimum `partitionColumn` yang digunakan untuk memutuskan langkah partisi. 
+ `numPartitions` — Integer, opsional, jumlah partisi. Nilai ini, bersama dengan `lowerBound` (inklusif) dan `upperBound` (eksklusif), membentuk langkah partisi untuk ekspresi klausul `WHERE` yang dihasilkan yang digunakan untuk membagi `partitionColumn`. 
**penting**  
Hati-hati dengan jumlah partisi karena terlalu banyak partisi dapat menyebabkan masalah pada sistem basis data eksternal Anda. 
+ `filterPredicate` — String, opsional, klausul syarat ekstra untuk mem-filter data dari sumber. Contoh: 

  ```
  BillingCity='Mountain View'
  ```

  Saat menggunakan sebuah *kueri* bukan sebuah nama *tabel*, Anda harus memvalidasi bahwa kueri bekerja dengan `filterPredicate` yang ditentukan. Contoh: 
  + Jika format kueri Anda adalah `"SELECT col1 FROM table1"`, maka uji kueri dengan menambahkan klausul `WHERE` pada akhir kueri yang menggunakan predikat filter. 
  + Jika format kueri Anda adalah `"SELECT col1 FROM table1 WHERE col2=val"`, maka uji kueri dengan memperluas klausul `WHERE` dengan `AND` dan ekspresi yang menggunakan predikat filter.
+ `dataTypeMapping` — Kamus, pemetaan jenis data kustom, opsional, yang membangun pemetaan dari jenis data **JDBC** ke jenis data **Glue**. Misalnya, opsi `"dataTypeMapping":{"FLOAT":"STRING"}` memetakan bidang data tipe JDBC `FLOAT` ke dalam `String` tipe Java dengan memanggil `ResultSet.getString()` metode driver, dan menggunakannya untuk membangun AWS Glue catatan. Objek `ResultSet` dilaksanakan oleh masing-masing driver, sehingga perilaku bersifat spesifik untuk driver yang Anda gunakan. Lihat dokumentasi untuk driver JDBC Anda untuk memahami bagaimana driver melakukan konversi. 
+ Tipe AWS Glue data yang didukung saat ini adalah:
  + DATE
  + STRING
  + TIMESTAMP
  + INT
  + FLOAT
  + LONG
  + BIGDECIMAL
  + BYTE
  + SHORT
  + DOUBLE

   Jenis data JDBC yang didukung adalah [Java8 java.sql.types](https://docs.oracle.com/javase/8/docs/api/java/sql/Types.html).

  Pemetaan tipe data default (dari JDBC ke) adalah: AWS Glue
  +  DATE -> DATE
  +  VARCHAR -> STRING
  +  CHAR -> STRING
  +  LONGNVARCHAR -> STRING
  +  TIMESTAMP -> TIMESTAMP
  +  INTEGER -> INT
  +  FLOAT -> FLOAT
  +  REAL -> FLOAT
  +  BIT -> BOOLEAN
  +  BOOLEAN -> BOOLEAN
  +  BIGINT -> LONG
  +  DECIMAL -> BIGDECIMAL
  +  NUMERIC -> BIGDECIMAL
  +  TINYINT -> SHORT
  +  SMALLINT -> SHORT
  +  DOUBLE -> DOUBLE

  Jika Anda menggunakan pemetaan tipe data kustom dengan opsi `dataTypeMapping`, maka Anda dapat menimpa pemetaan tipe data default. Hanya tipe data JDBC yang tercantum dalam pilihan `dataTypeMapping` yang terpengaruh; pemetaan default digunakan untuk semua jenis data JDBC lainnya. Anda dapat menambahkan pemetaan untuk jenis data JDBC tambahan, jika diperlukan. Jika tipe data JDBC tidak disertakan dalam pemetaan default atau pemetaan khusus, maka tipe data akan dikonversi ke tipe data secara default. AWS Glue `STRING` 

Contoh kode Python berikut menunjukkan cara membaca dari database JDBC dengan driver JDBC. AWS Marketplace Ia menunjukkan membaca dari basis data dan menulis ke sebuah lokasi S3. 

```
    import sys
    from awsglue.transforms import *
    from awsglue.utils import getResolvedOptions
    from pyspark.context import SparkContext
    from awsglue.context import GlueContext
    from awsglue.job import Job
     
    ## @params: [JOB_NAME]
    args = getResolvedOptions(sys.argv, ['JOB_NAME'])
     
    sc = SparkContext()
    glueContext = GlueContext(sc)
    spark = glueContext.spark_session
    job = Job(glueContext)
    job.init(args['JOB_NAME'], args)
    ## @type: DataSource
    ## @args: [connection_type = "marketplace.jdbc", connection_options = 
     {"dataTypeMapping":{"INTEGER":"STRING"},"upperBound":"200","query":"select id, 
       name, department from department where id < 200","numPartitions":"4",
       "partitionColumn":"id","lowerBound":"0","connectionName":"test-connection-jdbc"},
        transformation_ctx = "DataSource0"]
    ## @return: DataSource0
    ## @inputs: []
    DataSource0 = glueContext.create_dynamic_frame.from_options(connection_type = 
      "marketplace.jdbc", connection_options = {"dataTypeMapping":{"INTEGER":"STRING"},
      "upperBound":"200","query":"select id, name, department from department where 
       id < 200","numPartitions":"4","partitionColumn":"id","lowerBound":"0",
       "connectionName":"test-connection-jdbc"}, transformation_ctx = "DataSource0")
    ## @type: ApplyMapping
    ## @args: [mappings = [("department", "string", "department", "string"), ("name", "string",
      "name", "string"), ("id", "int", "id", "int")], transformation_ctx = "Transform0"]
    ## @return: Transform0
    ## @inputs: [frame = DataSource0]
    Transform0 = ApplyMapping.apply(frame = DataSource0, mappings = [("department", "string",
      "department", "string"), ("name", "string", "name", "string"), ("id", "int", "id", "int")], 
       transformation_ctx = "Transform0")
    ## @type: DataSink
    ## @args: [connection_type = "s3", format = "json", connection_options = {"path": 
     "s3://{{<S3 path>}}/", "partitionKeys": []}, transformation_ctx = "DataSink0"]
    ## @return: DataSink0
    ## @inputs: [frame = Transform0]
    DataSink0 = glueContext.write_dynamic_frame.from_options(frame = Transform0, 
      connection_type = "s3", format = "json", connection_options = {"path": 
      "s3://{{<S3 path>}}/", "partitionKeys": []}, transformation_ctx = "DataSink0")
    job.commit()
```

### Pilihan koneksi untuk tipe custom.athena atau marketplace.athena
<a name="marketplace-athena-connect-options"></a>
+ `className` — String, wajib, nama kelas driver. Saat Anda menggunakan Athena-CloudWatch konektor, nilai parameter ini adalah awalan dari nama kelas (misalnya,`"com.amazonaws.athena.connectors"`). Athena-CloudWatch Konektor terdiri dari dua kelas: handler metadata dan handler rekaman. Jika Anda menyediakan prefiks umum di sini, maka API memuat kelas yang benar berdasarkan prefiks itu.
+ `tableName`— String, diperlukan, nama aliran CloudWatch log untuk dibaca. Snippet kode ini menggunakan nama tampilan khusus `all_log_streams`, yang berarti bahwa bingkai data dinamis yang dikembalikan akan berisi data dari semua pengaliran log dalam grup log.
+ `schemaName`— String, diperlukan, nama grup CloudWatch log untuk dibaca. Misalnya, `/aws-glue/jobs/output`.
+ `connectionName` — String, wajib, nama koneksi yang dikaitkan dengan konektor.

Untuk opsi tambahan untuk konektor ini, lihat file [README CloudWatch Konektor Amazon Athena](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-cloudwatch) aktif. GitHub

Kode Python contoh berikut ini menunjukkan bagaimana membaca dari penyimpanan data Athena menggunakan konektor AWS Marketplace . Ia menunjukkan membaca dari Athena dan menulis ke sebuah lokasi S3. 

```
    import sys
    from awsglue.transforms import *
    from awsglue.utils import getResolvedOptions
    from pyspark.context import SparkContext
    from awsglue.context import GlueContext
    from awsglue.job import Job
     
    ## @params: [JOB_NAME]
    args = getResolvedOptions(sys.argv, ['JOB_NAME'])
     
    sc = SparkContext()
    glueContext = GlueContext(sc)
    spark = glueContext.spark_session
    job = Job(glueContext)
    job.init(args['JOB_NAME'], args)
    ## @type: DataSource
    ## @args: [connection_type = "marketplace.athena", connection_options = 
     {"tableName":"all_log_streams","schemaName":"/aws-glue/jobs/output",
      "connectionName":"test-connection-athena"}, transformation_ctx = "DataSource0"]
    ## @return: DataSource0
    ## @inputs: []
    DataSource0 = glueContext.create_dynamic_frame.from_options(connection_type = 
      "marketplace.athena", connection_options = {"tableName":"all_log_streams",,
      "schemaName":"/aws-glue/jobs/output","connectionName":
      "test-connection-athena"}, transformation_ctx = "DataSource0")
    ## @type: ApplyMapping
    ## @args: [mappings = [("department", "string", "department", "string"), ("name", "string",
      "name", "string"), ("id", "int", "id", "int")], transformation_ctx = "Transform0"]
    ## @return: Transform0
    ## @inputs: [frame = DataSource0]
    Transform0 = ApplyMapping.apply(frame = DataSource0, mappings = [("department", "string",
      "department", "string"), ("name", "string", "name", "string"), ("id", "int", "id", "int")], 
       transformation_ctx = "Transform0")
    ## @type: DataSink
    ## @args: [connection_type = "s3", format = "json", connection_options = {"path": 
     "s3://{{<S3 path>}}/", "partitionKeys": []}, transformation_ctx = "DataSink0"]
    ## @return: DataSink0
    ## @inputs: [frame = Transform0]
    DataSink0 = glueContext.write_dynamic_frame.from_options(frame = Transform0, 
      connection_type = "s3", format = "json", connection_options = {"path": 
      "s3://{{<S3 path>}}/", "partitionKeys": []}, transformation_ctx = "DataSink0")
    job.commit()
```

### Pilihan koneksi untuk jenis custom.spark atau marketplace.spark
<a name="marketplace-spark-connect-options"></a>
+ `className` — String, wajib, nama kelas konektor. 
+ `secretId` — String, opsional, yang digunakan untuk mengambil kredensial untuk koneksi konektor.
+ `connectionName` — String, wajib, nama koneksi yang dikaitkan dengan konektor.
+ Pilihan lain tergantung pada penyimpanan data. Misalnya, opsi OpenSearch konfigurasi dimulai dengan awalan`es`, seperti yang dijelaskan dalam dokumentasi [Elasticsearch for Apache](https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html) Hadoop. Koneksi Spark ke Snowflake menggunakan pilihan seperti `sfUser` dan `sfPassword`, seperti yang dijelaskan dalam dokumentasi [Menggunakan Konektor Spark](https://docs.snowflake.com/en/user-guide/spark-connector-use.html) di panduan *Menghubungkan ke Snowflake*.

Contoh kode Python berikut menunjukkan cara membaca dari penyimpanan OpenSearch data menggunakan koneksi`marketplace.spark`.

```
    import sys
    from awsglue.transforms import *
    from awsglue.utils import getResolvedOptions
    from pyspark.context import SparkContext
    from awsglue.context import GlueContext
    from awsglue.job import Job
     
    ## @params: [JOB_NAME]
    args = getResolvedOptions(sys.argv, ['JOB_NAME'])
     
    sc = SparkContext()
    glueContext = GlueContext(sc)
    spark = glueContext.spark_session
    job = Job(glueContext)
    job.init(args['JOB_NAME'], args)
    ## @type: DataSource
    ## @args: [connection_type = "marketplace.spark", connection_options = {"path":"test",
      "es.nodes.wan.only":"true","es.nodes":"https://{{<AWS endpoint>}}",
      "connectionName":"test-spark-es","es.port":"443"}, transformation_ctx = "DataSource0"]
    ## @return: DataSource0
    ## @inputs: []
    DataSource0 = glueContext.create_dynamic_frame.from_options(connection_type = 
      "marketplace.spark", connection_options = {"path":"test","es.nodes.wan.only":
      "true","es.nodes":"https://{{<AWS endpoint>}}","connectionName":
      "test-spark-es","es.port":"443"}, transformation_ctx = "DataSource0")
    ## @type: DataSink
    ## @args: [connection_type = "s3", format = "json", connection_options = {"path": 
         "s3://{{<S3 path>}}/", "partitionKeys": []}, transformation_ctx = "DataSink0"]
    ## @return: DataSink0
    ## @inputs: [frame = DataSource0]
    DataSink0 = glueContext.write_dynamic_frame.from_options(frame = DataSource0, 
       connection_type = "s3", format = "json", connection_options = {"path": 
       "s3://{{<S3 path>}}/", "partitionKeys": []}, transformation_ctx = "DataSink0")
    job.commit()
```

## Opsi umum
<a name="aws-glue-programming-etl-connect-general-options"></a>

Opsi di bagian ini disediakan sebagai`connection_options`, tetapi tidak secara khusus berlaku untuk satu konektor.

Parameter berikut digunakan secara umum saat mengkonfigurasi bookmark. Mereka mungkin berlaku untuk alur kerja Amazon S3 atau JDBC. Untuk informasi selengkapnya, lihat [Menggunakan bookmark pekerjaan](programming-etl-connect-bookmarks.md).
+ `jobBookmarkKeys`— Array nama kolom. 
+ `jobBookmarkKeysSortOrder`— String mendefinisikan bagaimana membandingkan nilai berdasarkan urutan pengurutan. Nilai-nilai yang valid: `"asc"`, `"desc"`.
+ `useS3ListImplementation`— Digunakan untuk mengelola kinerja memori saat mencantumkan konten bucket Amazon S3. Untuk informasi selengkapnya, lihat [Optimalkan manajemen memori di AWS Glue](https://aws.amazon.com/blogs/big-data/optimize-memory-management-in-aws-glue/).