Amazon Redshift ne prendra plus en charge la création de nouveaux Python à UDFs partir du patch 198. UDFs Le Python existant continuera de fonctionner jusqu'au 30 juin 2026. Pour plus d’informations, consultez le billet de blog
Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Types de données pris en charge
Les types de données suivants dans Amazon Redshift sont pris en charge par le connecteur Spark. Pour obtenir la liste complète des types de données pris en charge dans Amazon Redshift, consultez Types de données. Si un type de données ne figure pas dans la table ci-dessous, il n'est pas pris en charge dans le connecteur Spark.
| Type de données | les alias ; |
|---|---|
| SMALLINT | INT2 |
| INTEGER | ENTIER, INT4 |
| BIGINT | INT8 |
| DECIMAL | NUMERIC |
| REAL | FLOAT4 |
| DOUBLE PRECISION | FLOAT8, FLOTTEUR |
| BOOLEAN | BOOL |
| CHAR | CHARACTER, NCHAR, BPCHAR |
| VARCHAR | CHARACTER VARYING, NVARCHAR, TEXT |
| DATE | |
| TIMESTAMP | Horodatage sans fuseau horaire |
| TIMESTAMPTZ | Horodatage avec fuseau horaire |
| SUPER | |
| TIME | Heure sans fuseau horaire |
| TIMETZ | Heure avec fuseau horaire |
| VARBYTE | VARBINARY, BINARY VARYING |
Types de données complexes
Vous pouvez utiliser le connecteur Spark pour lire et écrire des types de données complexes Spark tels que ArrayType, MapType et StructType vers et depuis les colonnes de type de données Redshift SUPER. Si vous fournissez un schéma lors d'une opération de lecture, les données de la colonne sont converties dans les types complexes correspondants dans Spark, y compris les types imbriqués. De plus, si autopushdown est activé, la projection des attributs imbriqués, des valeurs de mappage et des indices de tableau est transférée vers Redshift afin qu'il ne soit plus nécessaire de décharger l'intégralité de la structure de données imbriquée lors de l'accès à une simple partie des données.
Lorsque vous écrivez DataFrames depuis le connecteur, toute colonne de type MapType (utilisantStringType)StructType, ou ArrayType est écrite dans une colonne de type de données Redshift SUPER. Lors de l'écriture de ces structures de données imbriquées, le paramètre tempformat doit être de type CSV, CSV GZIP ou PARQUET. L'utilisation de AVRO provoquera une exception. L'écriture d'une structure de données MapType dont le type de clé est autre que StringType provoquera également une exception.
StructType
L'exemple suivant montre comment créer une table avec un type de données SUPER contenant une structure.
create table contains_super (a super);
Vous pouvez ensuite utiliser le connecteur pour interroger un champ StringType hello à partir de la colonne SUPER a dans la table en utilisant un schéma comme dans l'exemple suivant.
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")
L'exemple suivant montre comment écrire une structure dans la colonne 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
Si vous préférez utiliser MapType pour représenter vos données, vous pouvez utiliser une structure de données MapType dans votre schéma et récupérer la valeur correspondant à une clé dans le mappage. Notez que toutes les clés de votre structure de données MapType doivent être de type String et que toutes les valeurs doivent être du même type, par exemple int.
L'exemple suivant montre comment obtenir la valeur de la clé hello dans la colonne 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
Si la colonne contient un tableau à la place d'une structure, vous pouvez utiliser le connecteur pour interroger le premier élément du tableau.
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]")
Limitations
L'utilisation de types de données complexes avec le connecteur Spark présente les limites suivantes :
-
Tous les noms des champs de structure imbriqués et les clés de mappage doivent être en minuscules. Si vous effectuez une requête pour obtenir les noms de champs complexes avec des lettres majuscules, vous pouvez essayer d'omettre le schéma et d'utiliser la fonction Spark
from_jsonpour convertir la chaîne renvoyée localement comme solution de contournement. -
Tous les champs de mappage utilisés dans les opérations de lecture et d'écriture doivent contenir uniquement des clés
StringType. -
Seuls
CSV,CSV GZIPetPARQUETsont des valeurs tempformat prises en charge pour l'écriture de types complexes dans Redshift. Une tentative d'utilisation deAVROlèvera une exception.