Unterstützte Datentypen - Amazon Redshift

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 ArrayTypeMapType, 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 StringTypehat, 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 und PARQUET für das Schreiben komplexer Typen nach Redshift unterstützt. Der Versuch AVRO zu verwenden, löst eine Ausnahme aus.