Jenis data yang didukung - Amazon Redshift

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.

  • HanyaCSV,CSV GZIP, dan PARQUET didukung nilai tempformat untuk menulis tipe kompleks ke Redshift. Mencoba menggunakan AVRO akan menimbulkan pengecualian.