Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Unterstützte Datentypen
Die folgenden Datentypen in Amazon Redshift werden im Spark-Connector unterstützt. Eine vollständige Liste der unterstützten Datentypen in Amazon Redshift finden Sie unter Datentypen. Wenn ein Datentyp nicht in der folgenden Tabelle enthalten ist, wird er im Spark-Connector nicht unterstützt.
Datentyp | Aliasnamen |
---|---|
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 | Zeitstempel ohne Zeitzone |
TIMESTAMPTZ | Timestamp with time zone |
SUPER | |
TIME | Time without time zone |
TIMETZ | Time with time zone |
VARBYTE | VARBINARY, BINARY VARYING |
Komplexe Datentypen
Sie können den Spark-Konnektor verwenden, um komplexe Spark-Datentypen wie ArrayType
MapType
, und in und aus SUPER Redshift-Datentypspalten StructType
zu lesen und zu schreiben. Wenn Sie während eines Lesevorgangs ein Schema angeben, werden in Spark die Daten in der Spalte in die entsprechenden komplexen Typen konvertiert, einschließlich aller verschachtelten Typen. Wenn darüber hinaus autopushdown
aktiviert ist, wird die Projektion von verschachtelten Attributen, Map-Werten und Array-Indizes nach Redshift verschoben, sodass die gesamte verschachtelte Datenstruktur nicht mehr entladen werden muss, wenn nur auf einen Teil der Daten zugegriffen wird.
Wenn Sie vom Konnektor DataFrames aus schreiben, ArrayType
wird jede Spalte vom Typ MapType
(usingStringType
)StructType
, oder in eine SUPER Redshift-Datentypspalte geschrieben. Beim Schreiben dieser verschachtelten Datenstrukturen muss der tempformat
-Parameter vom Typ CSV
, CSV GZIP
oder PARQUET
sein. Die Verwendung von AVRO
löst eine Ausnahme aus. Das Schreiben einer MapType
-Datenstruktur, die einen anderen Schlüsseltyp als StringType
hat, verursacht auch eine Ausnahme.
StructType
Das folgende Beispiel zeigt, wie Sie eine Tabelle mit einem SUPER Datentyp erstellen, der eine Struktur enthält
create table contains_super (a super);
Anschließend können Sie den Konnektor verwenden, um ein StringType
Feld hello
aus der SUPER Spalte a
in der Tabelle mithilfe eines Schemas wie im folgenden Beispiel abzufragen.
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")
Das folgende Beispiel zeigt, wie eine Struktur in die Spalte a
geschrieben wird.
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
Wenn Sie lieber MapType
verwenden, um Ihre Daten darzustellen, dann können Sie eine MapType
-Datenstruktur in Ihrem Schema verwenden und den Wert abrufen, der dem Schlüssel in der Map entspricht. Beachten Sie, dass alle Schlüssel in Ihrer MapType
-Datenstruktur vom Typ Zeichenfolge und alle Werte vom gleichen Typ sein müssen, z. B. int.
Das folgende Beispiel zeigt, wie der Wert des Schlüssels hello
in der Spalte a
abgerufen wird.
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
Wenn die Spalte ein Array statt einer Struktur enthält, können Sie den Connector verwenden, um das erste Element im Array abzufragen.
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]")
Einschränkungen
Die Verwendung komplexer Datentypen mit dem Spark-Connector hat die folgenden Einschränkungen:
-
Alle verschachtelten Strukturfeldnamen und Map-Schlüssel müssen in Kleinbuchstaben geschrieben werden. Wenn Sie komplexe Feldnamen mit Großbuchstaben abfragen, können Sie versuchen, das Schema wegzulassen und die
from_json
-Spark-Funktion zur lokalen Konvertierung der zurückgegebenen Zeichenfolge als Problemumgehung zu verwenden. -
Alle Map-Felder, die bei Lese- oder Schreiboperationen verwendet werden, dürfen nur
StringType
-Schlüssel haben. -
Es werden nur die Tempformat-Werte
CSV
,CSV GZIP
undPARQUET
für das Schreiben komplexer Typen nach Redshift unterstützt. Der VersuchAVRO
zu verwenden, löst eine Ausnahme aus.