Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Jenis data yang didukung
Tipe data berikut di Amazon Redshift didukung dengan konektor Spark. Untuk daftar lengkap tipe data yang didukung di Amazon Redshift, lihat Jenis data. Jika tipe data tidak ada dalam tabel di bawah ini, itu tidak didukung di konektor Spark.
Tipe data | Alias |
---|---|
SMALLINT | INT2 |
INTEGER | INT, INT4 |
BIGINT | INT8 |
DECIMAL | NUMERIC |
REAL | FLOAT4 |
DOUBLE PRECISION | FLOAT8, FLOAT |
BOOLEAN | BOOL |
CHAR | CHARACTER, NCHAR, BPCHAR |
VARCHAR | CHARACTER VARYING, NVARCHAR, TEXT |
DATE | |
TIMESTAMP | Stempel waktu tanpa zona waktu |
TIMESTAMPTZ | Stempel waktu dengan zona waktu |
SUPER | |
TIME | Waktu tanpa zona waktu |
TIMETZ | Waktu dengan zona waktu |
VARBYTE | VARBINARY, BINARY VARYING |
Tipe data yang kompleks
Anda dapat menggunakan konektor percikan untuk membaca dan menulis tipe data kompleks Spark sepertiArrayType
,MapType
, dan StructType
ke dan dari kolom tipe data RedshiftSUPER. 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
(menggunakanStringType
),StructType
, atau ArrayType
ditulis ke kolom tipe SUPER data Redshift. Saat menulis struktur data bersarang ini, tempformat
parameter harus bertipeCSV
,CSV GZIP
, atauPARQUET
. Menggunakan AVRO
akan menyebabkan pengecualian. Menulis struktur MapType
data yang memiliki tipe kunci selain juga StringType
akan menyebabkan pengecualian.
StructType
Contoh berikut menunjukkan cara membuat tabel dengan tipe SUPER data yang berisi struct
create table contains_super (a super);
Anda kemudian dapat menggunakan konektor untuk menanyakan StringType
bidang hello
dari SUPER kolom 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
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 koloma
.
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
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
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
, danPARQUET
didukung nilai tempformat untuk menulis tipe kompleks ke Redshift. Mencoba menggunakanAVRO
akan menimbulkan pengecualian.