Corriger les problèmes communs relatifs aux types de données Talend
Cet article explique comment éviter les problèmes les plus fréquents lorsque vous utilisez des types de données Talend.
Pour plus d'informations concernant le mapping de types de données dans le Studio Talend, consultez Mapping de types.
Types de données habituels
Numbers (Nombres)
Les fournisseurs Java et de bases de données fournissent différentes implémentations numériques. Le pilote JDBC doit effectuer la transition sans perte de données.
Cependant, il y a des types de données pour lesquels cela n'est pas possible. Les nombres à virgule flottante (Float) ou à virgule flottante à double précision ne peuvent contenir de valeur précise. Les opérations mathématiques sur ces nombres ont différents résultats en fonction de l'ordre des opérations. Une bonne pratique consiste à résumer les petits nombres et d'ajouter ensuite les plus gros.
Une autre erreur fréquente est d'utiliser globalMap
. Vous devez utiliser la Classe et le primitif.
int
>Integer
double
>Double
Lorsque vous convertissez un type String en un nombre, vous pouvez utiliser :
Integer.valueOf
/Integer.parseInt
Double.valueOf
/Double.parseDouble
Date
java.util.Date
et java.sql.Date
contiennent des horodatages. Le composant tLogRow affiche ces horodatages en se basant sur le modèle que vous configurez. Si le modèle contient YYYY
, l'objet de données sous-jacent contiendra davantage d'informations. Les fuseaux horaires sont un autre exemple d'information généralement ignorée, pouvant créer un décalage des dates.
Par exemple, une base de données retourne une date 2021-03-10 Midnight
, mais une autre base de données la traite comme 2021-03-10 Midnight in Central Europe GMT+2
. Elle la convertit en UTC pour la stocker et la transforme en un type de date dont le résultat est 2021-03-09
après ingestion. C'est souvent perçu comme un bug, mais il y a une raison logique à ce comportement.
La base de données stocke l'objet comme 2021-03-10
.
Une fois convertie en Java, la date devient (en fonction de la conversion utilisée) :
2021-03-10 00:00:00.000 UTC
2021-03-10 02:00:00.000 GMT+2
La date est ensuite passée à la base de données, qui la traite comme :
2021-03-10 00:00:00.000 GMT+2
2021-03-09 22:00:00.000 UTC
La conversion vers UTC décale la date d'un jour. Ainsi, lorsque vous rencontrez des problèmes relatifs à des dates, vous devez analyser les dates entières, y compris les fuseaux horaires, les heures et les secondes.
Precision (Précision)
Puisque Talend utilise java.util.Date
, la précision des microsecondes et des nanosecondes n'est pas disponible. Cependant, certains composants peuvent vérifier si le type d'objet est java.sql.Timestamp
. Dans ce cas, les nanosecondes sont disponibles. Pour les utiliser, sélectionnez le type Object dans la définition du schéma et les composants sources et cibles qui les supportent.
Exécution expérimentale
Vous pouvez effectuer les opérations suivantes lors d'un dépannage :
- Utilisez un composant tFileOutput pour sauvegarder et lire ces valeurs. Ainsi, vous avez un meilleur contrôle sur les fuseaux horaires.
- Utilisez le paramètre
-Duser.timezone
pour voir si cela modifie le comportement. Pour plus d'informations, consultez Time Zone Settings in the JRE (en anglais). - Consultez la documentation relative aux pilotes JDBC pour apprendre à gérer ces fuseaux horaires.
- Utilisez un composant tLogRow avec le modèle et résultat suivants :
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
La base de données cible peut, ou ne peut pas, stocker la partie horodatage des exemples précédents, combinée au fuseau horaire. Cela risque de décaler les jours.
Solutions de contournement possibles
Utilisez des types String et voyez si les bases de données ou leurs pilotes peuvent gérer la transformation. Avec un type String, vous voyez ce que vous obtenez, il n'y a pas d'information cachée.
Convertissez d'un fuseau horaire à l'autre à l'aide du code Java dans un composant tJavaRow :
String pattern = "yyyy-MM-dd";
log.info(TalendDate.formatDate(pattern, input_row.startDate));
output_row.startDateUTC = TalendDate.parseDateInUTC("yyyy-MM-dd zzz",
TalendDate.formatDate("yyyy-MM-dd", input_row.startDate)+" UTC");
Pour plus d'informations concernant le comportement des données, consultez Your Calendrical Fallacy Is... (en anglais).
byte[] / binary (octet[]/binaire)
Ce type de données est généralement utilisé avec des images, BLOB et autres données binaires.
Cependant, certains composants peuvent gérer le format binaire en format encodé en Base 64, représenté comme des chaînes de caractères (String). L'erreur la plus fréquente associée à ce type est l'utilisation d'un type Object à la place, ce qui affiche un résultat comme @[aaa123
dans les logs, car l'ID de l'objet est retourné, au lieu de sa valeur, lorsque .toString()
est utilisé sur un type Object.
Object (Objet)
Un autre nom pour ce type de données peut être Other
. Il peut représenter tout type de données Java présenté ci-dessus. Cela peut s'avérer utile pour représenter des types spéciaux, comme les horodatages (timestamp).
Cependant, pour accéder à toutes les informations disponibles, vous devez utiliser son type d'origine.
Comparison (Comparaison)
==
. Cependant, pour les autres types de données, comme String, les comparaisons s'effectuent via les fonctions .equals()
ou .compareTo()
.
Erreurs les plus fréquentes :
context.value == "foo"
ne fonctionne pas.
context.value.equals("foo")
peut conduire à une exception NullPointerException. Cependant, "foo".equals(context.value)
donne "false (faux)" si la valeur est nulle.
Types de données spéciaux
Snowflake -Type GEOGRAPHY
Snowflake supporte le type GEOGRAPHY. Cependant, Talend ne le supporte pas nativement.
Pour plus d'informations concernant la conversion de types String en types GEOGRAPHY, consultez la documentation Snowflake Types de données géospatiales.
En appliquant automatiquement la fonction TO_GEOGRAPHY, vous pouvez créer un schéma et tester les données à l'aide d'un composant tFixedFlowInput.
En définissant votre schéma d'entrée comme présenté ci-dessus et en ayant les données géographiques représentées par le type String suivant :
POINT(-122.35 37.55)
La table Snowflake est définie comme suit :
create table "SAMPLEGEO" (str1 text, str2 geography, int1 number);
L'utilisation du composant tSnowflakeOutputBulkExec a pour résultat :
Le type String Talend est converti en type GEOGRAPHY dans Snowflake.
Si vous utilisez un type de données String ou Object, il est utile de vérifier que les types de données spéciaux ou exotiques peuvent être chargés dans la base de données.