

 Amazon Redshift tidak akan lagi mendukung pembuatan Python UDFs baru mulai Patch 198. Python yang ada UDFs akan terus berfungsi hingga 30 Juni 2026. Untuk informasi lebih lanjut, lihat [posting blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

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

# Integrasi Amazon Redshift untuk Apache Spark
<a name="spark-redshift-connector"></a>

 [Apache Spark](https://aws.amazon.com/emr/features/spark/) adalah kerangka pemrosesan terdistribusi dan model pemrograman yang membantu Anda melakukan pembelajaran mesin, pemrosesan aliran, atau analisis grafik. Mirip dengan Apache Hadoop, Spark merupakan sistem pemrosesan terdistribusi sumber terbuka, yang biasa digunakan untuk beban kerja big data. Spark memiliki mesin  eksekusi grafik asiklik terarah (DAG) yang dioptimalkan dan secara aktif menyimpan data dalam memori. Ini dapat meningkatkan kinerja, terutama untuk algoritma tertentu dan kueri interaktif. 

 Integrasi ini memberi Anda konektor Spark yang dapat Anda gunakan untuk membangun aplikasi Apache Spark yang membaca dan menulis ke data di Amazon Redshift dan Amazon Redshift Serverless. Aplikasi ini tidak berkompromi pada kinerja aplikasi atau konsistensi transaksional data. Integrasi ini secara otomatis disertakan dalam [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/) dan [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/), sehingga Anda dapat segera menjalankan pekerjaan Apache Spark yang mengakses dan memuat data ke Amazon Redshift sebagai bagian dari pipa penyerapan dan transformasi data Anda. 

Saat ini, Anda dapat menggunakan versi 3.3.x, 3.4.x, 3.5.x, dan 4.0.0 dari Spark dengan integrasi ini.

 Integrasi ini menyediakan yang berikut: 
+  AWS Identity and Access Management (IAM) otentikasi. Untuk informasi selengkapnya, lihat [Manajemen identitas dan akses di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html). 
+ Predikat dan kueri pushdown untuk meningkatkan kinerja.
+  Jenis data Amazon Redshift. 
+ Konektivitas ke Amazon Redshift dan Amazon Redshift Tanpa Server.

## Pertimbangan dan batasan saat menggunakan konektor Spark
<a name="spark-redshift-connector-considerations"></a>
+  URI tempdir menunjuk ke lokasi Amazon S3. Direktori temp ini tidak dibersihkan secara otomatis dan dapat menambah biaya tambahan. Sebaiknya gunakan [kebijakan siklus hidup Amazon S3 di](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) *Panduan Pengguna Layanan Penyimpanan Sederhana Amazon* untuk menentukan aturan penyimpanan bucket Amazon S3. 
+  Secara default, salinan antara Amazon S3 dan Redshift tidak berfungsi jika bucket S3 dan cluster Redshift berada di Wilayah yang berbeda. AWS Untuk menggunakan AWS Regions terpisah, atur `tempdir_region` parameter ke Region bucket S3 yang digunakan untuk. `tempdir`
+ Cross-Region menulis antara S3 dan Redshift jika menulis data Parket menggunakan parameter. `tempformat`
+ Sebaiknya gunakan [enkripsi sisi server Amazon S3 untuk mengenkripsi bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) Amazon S3 yang digunakan. 
+ Kami merekomendasikan untuk [memblokir akses publik ke bucket Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html). 
+  Kami menyarankan agar cluster Amazon Redshift tidak dapat diakses publik. 
+  Sebaiknya aktifkan pencatatan [audit Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html). 
+  Sebaiknya aktifkan enkripsi saat [istirahat Amazon Redshift.](https://docs.aws.amazon.com/redshift/latest/mgmt/security-server-side-encryption.html) 
+  Sebaiknya aktifkan SSL untuk koneksi JDBC dari Spark di Amazon EMR ke Amazon Redshift. 
+ Kami merekomendasikan untuk meneruskan peran IAM menggunakan parameter `aws_iam_role` untuk parameter autentikasi Amazon Redshift.

# Otentikasi dengan konektor Spark
<a name="redshift-spark-connector-authentication"></a>

Diagram berikut menjelaskan otentikasi antara Amazon S3, Amazon Redshift, driver Spark, dan pelaksana Spark.

![\[Ini adalah diagram otentikasi konektor percikan.\]](http://docs.aws.amazon.com/id_id/redshift/latest/mgmt/images/spark-connector-authentication.png)


## Otentikasi antara Redshift dan Spark
<a name="redshift-spark-authentication"></a>

 Anda dapat menggunakan driver versi 2.x driver JDBC yang disediakan Amazon Redshift untuk terhubung ke Amazon Redshift dengan konektor Spark dengan menentukan kredenal masuk. Untuk menggunakan IAM, [konfigurasikan url JDBC Anda untuk menggunakan](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html) otentikasi IAM. Untuk menyambung ke kluster Redshift dari Amazon EMR atau AWS Glue, pastikan bahwa peran IAM Anda memiliki izin yang diperlukan untuk mengambil kredenal IAM sementara. Daftar berikut menjelaskan semua izin yang diperlukan peran IAM Anda untuk mengambil kredensil dan menjalankan operasi Amazon S3. 
+ [Redshift: GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/APIReference/API_GetClusterCredentials.html) (untuk cluster Redshift yang disediakan)
+ [Redshift: DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html) (untuk cluster Redshift yang disediakan)
+ [Redshift: GetWorkgroup](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetWorkgroup.html) (untuk grup kerja Amazon Redshift Tanpa Server)
+ [Redshift: GetCredentials](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetCredentials.html) (untuk grup kerja Amazon Redshift Tanpa Server)
+ [s3: ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)
+ [s3: GetBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucket.html)
+ [s3: GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)
+ [s3: PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [s3: GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html)

 Untuk informasi selengkapnya GetClusterCredentials, lihat [kebijakan IAM untuk GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#redshift-policy-resources.getclustercredentials-resources). 

Anda juga harus memastikan bahwa Amazon Redshift dapat mengambil peran IAM selama `COPY` dan operasi. `UNLOAD`

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

Jika Anda menggunakan driver JDBC terbaru, driver akan secara otomatis mengelola transisi dari sertifikat yang ditandatangani sendiri Amazon Redshift ke sertifikat ACM. Namun, Anda harus [menentukan opsi SSL ke url JDBC](https://docs.aws.amazon.com/redshift/latest/mgmt/jdbc20-configuration-options.html#jdbc20-ssl-option). 

 Berikut ini adalah contoh cara menentukan URL driver JDBC dan terhubung `aws_iam_role` ke Amazon Redshift. 

```
df.write \
  .format("io.github.spark_redshift_community.spark.redshift ") \
  .option("url", "jdbc:redshift:iam://<the-rest-of-the-connection-string>") \
  .option("dbtable", "<your-table-name>") \
  .option("tempdir", "s3a://<your-bucket>/<your-directory-path>") \
  .option("aws_iam_role", "<your-aws-role-arn>") \
  .mode("error") \
  .save()
```

## Otentikasi antara Amazon S3 dan Spark
<a name="spark-s3-authentication"></a>

 Jika Anda menggunakan peran IAM untuk mengautentikasi antara Spark dan Amazon S3, gunakan salah satu metode berikut: 
+  AWS SDK for Java akan secara otomatis mencoba AWS menemukan kredensil dengan menggunakan rantai penyedia kredensi default yang diimplementasikan oleh kelas Default. AWSCredentials ProviderChain Untuk informasi selengkapnya, lihat [Menggunakan Rantai Penyedia Kredenal Default](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default).
+ Anda dapat menentukan AWS kunci melalui properti [konfigurasi Hadoop](https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/index.md). Misalnya, jika `tempdir` konfigurasi Anda menunjuk ke `s3n://` sistem file, setel `fs.s3n.awsAccessKeyId` dan `fs.s3n.awsSecretAccessKey` properti dalam file konfigurasi XMLHadoop atau panggil `sc.hadoopConfiguration.set()` untuk mengubah konfigurasi Hadoop global Spark.

Misalnya, jika Anda menggunakan sistem file s3n, tambahkan:

```
sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "YOUR_KEY_ID")
sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "YOUR_SECRET_ACCESS_KEY")
```

Untuk sistem file s3a, tambahkan:

```
sc.hadoopConfiguration.set("fs.s3a.access.key", "YOUR_KEY_ID")
sc.hadoopConfiguration.set("fs.s3a.secret.key", "YOUR_SECRET_ACCESS_KEY")
```

Jika Anda menggunakan Python, gunakan operasi berikut:

```
sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "YOUR_KEY_ID")
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", "YOUR_SECRET_ACCESS_KEY")
```
+ Encode kunci otentikasi di URL. `tempdir` Misalnya, URI `s3n://ACCESSKEY:SECRETKEY@bucket/path/to/temp/dir` mengkodekan key pair (`ACCESSKEY`,`SECRETKEY`).

## Otentikasi antara Redshift dan Amazon S3
<a name="redshift-s3-authentication"></a>

 Jika Anda menggunakan perintah COPY dan UNLOAD dalam kueri, Anda juga harus memberikan Amazon S3 akses ke Amazon Redshift untuk menjalankan kueri atas nama Anda. Untuk melakukannya, pertama-tama [otorisasi Amazon Redshift untuk mengakses layanan AWS lain](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), lalu otorisasi operasi [COPY dan UNLOAD](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) menggunakan peran IAM. 

Sebagai praktik terbaik, kami menyarankan untuk melampirkan kebijakan izin ke peran IAM dan kemudian menetapkannya ke pengguna dan grup sesuai kebutuhan. Untuk informasi selengkapnya, lihat [Manajemen identitas dan akses di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html).

## Integrasi dengan AWS Secrets Manager
<a name="redshift-secrets-manager-authentication"></a>

Anda dapat mengambil nama pengguna Redshift dan kredenal kata sandi Anda dari rahasia yang disimpan di. AWS Secrets Manager Untuk secara otomatis menyediakan kredenal Redshift, gunakan parameter. `secret.id` Untuk informasi selengkapnya tentang cara membuat rahasia kredensil Redshift, lihat [Membuat](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_database_secret.html) rahasia database. AWS Secrets Manager 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/redshift/latest/mgmt/redshift-spark-connector-authentication.html)

**catatan**  
 Pengakuan: Dokumentasi ini berisi kode contoh dan bahasa yang dikembangkan oleh [Apache Software Foundation](http://www.apache.org/) yang dilisensikan di bawah lisensi [Apache](https://www.apache.org/licenses/LICENSE-2.0) 2.0. 

# Peningkatan kinerja dengan pushdown
<a name="spark-redshift-connector-pushdown"></a>

 Konektor Spark secara otomatis menerapkan predikat dan pushdown kueri untuk mengoptimalkan kinerja. Dukungan ini berarti bahwa jika Anda menggunakan fungsi yang didukung dalam kueri Anda, konektor Spark akan mengubah fungsi menjadi kueri SQL dan menjalankan kueri di Amazon Redshift. Optimalisasi ini menghasilkan lebih sedikit data yang diambil, sehingga Apache Spark dapat memproses lebih sedikit data dan memiliki kinerja yang lebih baik. Secara default, pushdown diaktifkan secara otomatis. Untuk menonaktifkannya, atur `autopushdown` ke false. 

```
import sqlContext.implicits._val 
 sample= sqlContext.read
    .format("io.github.spark_redshift_community.spark.redshift")
    .option("url",jdbcURL )
    .option("tempdir", tempS3Dir)
    .option("dbtable", "event")
    .option("autopushdown", "false")
    .load()
```

 Fungsi-fungsi berikut didukung dengan pushdown. Jika Anda menggunakan fungsi yang tidak ada dalam daftar ini, konektor Spark akan menjalankan fungsi di Spark alih-alih Amazon Redshift, menghasilkan kinerja yang tidak dioptimalkan. Untuk daftar lengkap fungsi di Spark, lihat [Fungsi bawaan](https://spark.apache.org/docs/latest/api/sql/index.html). 
+ Fungsi agregasi
  + rata-rata
  + count
  + max
  + min
  + sum
  + stddev\$1samp
  + stddev\$1pop
  + var\$1samp
  + var\$1pop
+ Operator Boolean
  + in
  + isnull
  + isnotnull
  + mengandung
  + berakhir dengan
  + mulaidengan
+ Operator logis
  + and
  + atau
  + tidak (atau\$1)
+ Fungsi matematika
  + \$1
  + -
  + \$1
  + /
  + - (unary)
  + perut
  + acos
  + asin
  + atan
  + ceil
  + cos
  + exp
  + lantai
  + terbesar
  + paling sedikit
  + log10
  + pi
  + pow
  + bulat
  + dosa
  + sqrt
  + tan
+ Fungsi lain-lain
  + melemparkan
  + coalesce
  + desimal
  + jika
  + in
+ Operator relasional
  + \$1=
  + =
  + >
  + >=
  + <
  + <=
+ Fungsi string
  + ascii
  + lpad
  + rpad
  + menerjemahkan
  + atas
  + menurunkan
  + length
  + memangkas
  + ltrim
  + rtrim
  + suka
  + substring
  + concat
+ Fungsi waktu dan tanggal
  + add\$1months
  + date
  + date\$1add
  + date\$1sub
  + date\$1trunc
  + timestamp
  + batang
+ Operasi matematika
  + CheckOverflow
  + PromotePrecision
+ Operasi relasional
  + Alias (misalnya, AS)
  + CaseWhen
  + Berbeda
  + InSet
  + Bergabung dan bergabung silang
  + Batas
  + Serikat pekerja, serikat semua
  + ScalarSubquery
  + Sortir (naik dan turun)
  + UnscaledValue

# Opsi konfigurasi lainnya
<a name="spark-redshift-connector-other-config"></a>

Di halaman ini, Anda dapat menemukan deskripsi untuk opsi yang dapat Anda tentukan untuk konektor Amazon Redshift Spark.

## Ukuran maksimum kolom string
<a name="spark-redshift-connector-other-config-max-size"></a>

Redshift membuat kolom string sebagai kolom teks saat membuat tabel, yang disimpan sebagai VARCHAR (256). Jika Anda menginginkan kolom yang mendukung ukuran yang lebih besar, Anda dapat menggunakan maxlength untuk menentukan panjang maksimum kolom string. Berikut ini adalah contoh cara menentukan`maxlength`. 

```
columnLengthMap.foreach { case (colName, length) =>
  val metadata = new MetadataBuilder().putLong("maxlength", length).build()
  df = df.withColumn(colName, df(colName).as(colName, metadata))
}
```

## Jenis kolom
<a name="spark-redshift-connector-other-config-column-type"></a>

Untuk mengatur jenis kolom, gunakan `redshift_type` bidang.

```
columnTypeMap.foreach { case (colName, colType) =>
  val metadata = new MetadataBuilder().putString("redshift_type", colType).build()
  df = df.withColumn(colName, df(colName).as(colName, metadata))
}
```

## Pengkodean kompresi pada kolom
<a name="spark-redshift-connector-other-config-compression-encoding"></a>

 Untuk menggunakan pengkodean kompresi tertentu pada kolom, gunakan bidang pengkodean. Untuk daftar lengkap penyandian kompresi dukungan, lihat Pengkodean [kompresi](https://docs.aws.amazon.com/redshift/latest/dg/c_Compression_encodings.html). 

## Deskripsi untuk kolom
<a name="spark-redshift-connector-other-config-description"></a>

Untuk mengatur deskripsi, gunakan `description` bidang.

## Otentikasi antara Redshift dan Amazon S3
<a name="spark-redshift-connector-other-config-unload-as-text"></a>

 Secara default, hasilnya diturunkan ke Amazon S3 dalam format parket. Untuk membongkar hasilnya sebagai file teks yang dibatasi pipa, tentukan opsi berikut. 

```
.option("unload_s3_format", "TEXT")
```

## Pernyataan pushdown
<a name="spark-redshift-connector-other-config-lazy-pushdown"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/redshift/latest/mgmt/spark-redshift-connector-other-config.html)

## Parameter konektor
<a name="spark-redshift-connector-other-config-spark-parameters"></a>

Peta parameter atau `OPTIONS` di Spark SQL mendukung pengaturan berikut.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/redshift/latest/mgmt/spark-redshift-connector-other-config.html)

**catatan**  
 Pengakuan: Dokumentasi ini berisi kode contoh dan bahasa yang dikembangkan oleh [Apache Software Foundation](http://www.apache.org/) yang dilisensikan di bawah lisensi [Apache](https://www.apache.org/licenses/LICENSE-2.0) 2.0. 

# Jenis data yang didukung
<a name="spark-redshift-connector-data-types"></a>

Tipe data berikut di Amazon Redshift didukung dengan konektor Spark. Untuk daftar lengkap tipe data yang didukung di Amazon Redshift, lihat Jenis [data](https://docs.aws.amazon.com//redshift/latest/dg/c_Supported_data_types.html). Jika tipe data tidak ada dalam tabel di bawah ini, itu tidak didukung di konektor Spark.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/redshift/latest/mgmt/spark-redshift-connector-data-types.html)

## Tipe data yang kompleks
<a name="spark-redshift-connector-complex-data-types"></a>

 Anda dapat menggunakan konektor percikan untuk membaca dan menulis tipe data kompleks Spark seperti`ArrayType`,`MapType`, dan `StructType` ke dan dari kolom tipe data Redshift SUPER. Jika Anda memberikan skema selama operasi baca, data di kolom akan dikonversi ke tipe kompleks yang sesuai di Spark, termasuk semua jenis bersarang. Selain itu, jika `autopushdown` diaktifkan, proyeksi atribut bersarang, nilai peta, dan indeks array didorong ke Redshift sehingga seluruh struktur data bersarang tidak perlu lagi dibongkar saat mengakses hanya sebagian data. 

Saat Anda menulis DataFrames dari konektor, kolom jenis apa pun `MapType` (menggunakan`StringType`),`StructType`, atau `ArrayType` ditulis ke kolom tipe data Redshift SUPER. Saat menulis struktur data bersarang ini, `tempformat` parameter harus bertipe`CSV`,`CSV GZIP`, atau`PARQUET`. Menggunakan `AVRO` akan menyebabkan pengecualian. Menulis struktur `MapType` data yang memiliki tipe kunci selain juga `StringType` akan menyebabkan pengecualian. 

### StructType
<a name="spark-redshift-connector-complex-data-types-examples-structtype"></a>

Contoh berikut menunjukkan cara membuat tabel dengan tipe data SUPER yang berisi struct

```
create table contains_super (a super);
```

Anda kemudian dapat menggunakan konektor untuk menanyakan `StringType` bidang `hello` dari kolom SUPER `a` dalam tabel menggunakan skema seperti pada contoh berikut.

```
import org.apache.spark.sql.types._

val sc = // existing SparkContext
val sqlContext = new SQLContext(sc)

val schema = StructType(StructField("a", StructType(StructField("hello", StringType) ::Nil)) :: Nil)

val helloDF = sqlContext.read
.format("io.github.spark_redshift_community.spark.redshift")
.option("url", jdbcURL )
.option("tempdir", tempS3Dir)
.option("dbtable", "contains_super")
.schema(schema)
.load().selectExpr("a.hello")
```

Contoh berikut menunjukkan bagaimana menulis struct ke kolom. `a`

```
import org.apache.spark.sql.types._
import org.apache.spark.sql._

val sc = // existing SparkContext
val sqlContext = new SQLContext(sc)

val schema = StructType(StructField("a", StructType(StructField("hello", StringType) ::Nil)) :: Nil)
val data = sc.parallelize(Seq(Row(Row("world"))))
val mydf = sqlContext.createDataFrame(data, schema)

mydf.write.format("io.github.spark_redshift_community.spark.redshift").
option("url", jdbcUrl).
option("dbtable", tableName).
option("tempdir", tempS3Dir).
option("tempformat", "CSV").
mode(SaveMode.Append).save
```

### MapType
<a name="spark-redshift-connector-complex-data-types-examples-maptype"></a>

Jika Anda lebih suka menggunakan a `MapType` untuk mewakili data Anda, maka Anda dapat menggunakan struktur `MapType` data dalam skema Anda dan mengambil nilai yang sesuai dengan kunci di peta. Perhatikan bahwa semua kunci dalam struktur `MapType` data Anda harus bertipe String, dan semua nilai harus dari jenis yang sama, seperti int. 

Contoh berikut menunjukkan bagaimana untuk mendapatkan nilai kunci `hello` di kolom`a`.

```
import org.apache.spark.sql.types._

val sc = // existing SparkContext
val sqlContext = new SQLContext(sc)

val schema = StructType(StructField("a", MapType(StringType, IntegerType))::Nil)

val helloDF = sqlContext.read
    .format("io.github.spark_redshift_community.spark.redshift")
    .option("url", jdbcURL )
    .option("tempdir", tempS3Dir)
    .option("dbtable", "contains_super")
    .schema(schema)
    .load().selectExpr("a['hello']")
```

### ArrayType
<a name="spark-redshift-connector-complex-data-types-examples-arraytype"></a>

Jika kolom berisi array bukan struct, Anda dapat menggunakan konektor untuk query elemen pertama dalam array.

```
import org.apache.spark.sql.types._

val sc = // existing SparkContext
val sqlContext = new SQLContext(sc)

val schema = StructType(StructField("a", ArrayType(IntegerType)):: Nil)

val helloDF = sqlContext.read
    .format("io.github.spark_redshift_community.spark.redshift")
    .option("url", jdbcURL )
    .option("tempdir", tempS3Dir)
    .option("dbtable", "contains_super")
    .schema(schema)
    .load().selectExpr("a[0]")
```

### Batasan
<a name="spark-redshift-connector-complex-data-types-limitations"></a>

Menggunakan tipe data yang kompleks dengan konektor percikan memiliki batasan berikut:
+ Semua nama bidang struct bersarang dan kunci peta harus huruf kecil. Jika menanyakan nama bidang kompleks dengan huruf besar, Anda dapat mencoba menghilangkan skema dan menggunakan fungsi `from_json` percikan untuk mengonversi string yang dikembalikan secara lokal sebagai solusi.
+ Setiap bidang peta yang digunakan dalam operasi baca atau tulis harus hanya memiliki `StringType` kunci.
+ Hanya`CSV`,`CSV GZIP`, dan `PARQUET ` didukung nilai tempformat untuk menulis tipe kompleks ke Redshift. Mencoba menggunakan `AVRO ` akan menimbulkan pengecualian.