0
votes

Redshift Glue Job Bigint Numéro

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()


1 commentaires

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?


3 Réponses :


1
votes

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, vendre_long

Les mappages d'étincelle à RedShift peuvent être trouvés dans le pilote JDBC ici . xxx


3 commentaires

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)



1
votes

Essayez d'utiliser la cartographie: ("Vendre", "INT", "VENDRE", "LONG")

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.

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'.

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.

J'espère que cela vous aidera!


1 commentaires

Merci pour la réponse. Je vais essayer cela aussi.



0
votes

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
2) Assurez-vous que cette ligne de code est dans votre travail de colle: xxx

3) après étape 2 et tout ce que les trucs jusqu'à DropNullfields3 (et c'était notre solution finale) vous Doit être jeté à long à nouveau! avec la codine suivante: xxx

4) Vous pouvez simplement utiliser ce DF pour votre ligne de chargement finale: < / p> xxx

espère que cela aide!


0 commentaires