J'ai une base de données Redshi9ft. Dans la base de données, j'ai créé une table et dans le tableau, j'ai une colonne Bigint. J'ai créé un travail de colle pour insérer des données dans Redshift. Mais le problème est avec le champ de Bigint. Ce n'est pas l'insertion. semble un peu de problème avec Bigint. Le code de travail est ci-dessous. J'utilise Python 3 et Spark 2.2,
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job args = getResolvedOptions(sys.argv, ['TempDir','JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "test", table_name = "tbl_test", transformation_ctx = "datasource0") applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [("testdata", "string", "testdata", "string"), ("selling", "bigint", "selling", "bigint")], transformation_ctx = "applymapping1") resolvechoice2 = ResolveChoice.apply(frame = applymapping1, choice = "make_cols", transformation_ctx = "resolvechoice2") dropnullfields3 = DropNullFields.apply(frame = resolvechoice2, transformation_ctx = "dropnullfields3") datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(frame = dropnullfields3, catalog_connection = "redshift_con", connection_options = {"dbtable": "tbl_test", "database": "test"}, redshift_tmp_dir = args["TempDir"], transformation_ctx = "datasink4") job.commit()
3 Réponses :
Essayez de jeter les types à «Long» dans votre appel ApplyMapping. Si votre travail de colle n'échoue pas l'écriture à RedShift, une nouvelle colonne sera créée avec le même nom et le type de données redshift. Dans ce cas, Les mappages d'étincelle à RedShift peuvent être trouvés dans le pilote JDBC ici . p> vendre_long code>
J'ai essayé cela avec longtemps aussi ("Vendre", "Long", "Vendre", "Long") et ("Vendre", "Long", "Vendre", "Bigint") mais pas travaillé.
Pouvez-vous poster votre table redshift DDL.
Veuillez trouver ci-dessous la table. Le schéma de la table ci-dessous n'est qu'un exemple, crée un test de table (item1 Bigint NULL, élément2 varchar (5000) null, item3 TIMESTAMP NULL, Item4 Smallint Null, Item5 Bool Null)
Essayez d'utiliser la cartographie: ("Vendre", "INT", "VENDRE", "LONG") P>
Si cela ne fonctionne pas, vous devez publier la définition "TBL_TEST" dans le catalogue de colle. Le premier type de votre application applicable doit correspondre au type répertorié dans la définition de la table du catalogue. P>
J'ai eu un problème similaire, il s'est avéré que le type sur la table de colle créé par le robot de colle de la console était "INT", pas "long", donc le mappage d'applications nécessaire pour être ("Nom de terrain", "INT" , "Nom de terrain", "long") dans le travail de colle pour le type redshift 'Bigint'. P>
Fait intéressant, cela m'a permis de conserver la valeur dans la colle DynamicFrame et même d'imprimer aux journaux immédiatement avant d'écrire lorsque j'avais l'apply-mappage comme ("champ", "long", "long"), mais n'écrirait pas les données à Redshift. P>
J'espère que cela vous aidera! P>
Merci pour la réponse. Je vais essayer cela aussi.
Nous avons eu le même problème, l'importation de valeurs avec Int et Bigint n'entraîna qu'une des deux types de données.
Nous sommes venus autour de cela avec cette solution:
1) Assurez-vous que votre table source dans Colle Crawler a «Bigint» comme DataType de 3) après étape 2 et tout ce que les trucs jusqu'à DropNullfields3 (et c'était notre solution finale) vous Doit être jeté à long 4) Vous pouvez simplement utiliser ce DF pour votre ligne de chargement finale: < / p> espère que cela aide! p> p>
2) Assurez-vous que cette ligne de code est dans votre travail de colle: p>
Votre description: "Le problème est avec le champ de Bigint. Il ne fait pas l'insertion." est un peu vague. Quel message d'erreur voyez-vous?