2013-04-05 4 views
4

Je réalise un projet de migration de données dans Talend et pour l'une des tâches je dois traiter une grande table avec beaucoup de colonnes et mapper les (anciennes) données à une valeur différente pour le nouveau modèle.
J'ai une table de mappage unique avec trois colonnes.
Variables internes Talend

Exemple:

Column name | Value old | Value new 
     "col 1"   1   3 
     "col 1"   3   2 
     "col 2"   10   7 
     etc 

De cette façon, je peux parler en utilisant « nom de colonne » aux valeurs liées à la colonne I besoin de carte. Utilisation de l'ancienne valeur en tant que recherche dans la table de mappage à l'aide de "nom de colonne": lorsque l'ancienne valeur correspond, elle renvoie la nouvelle valeur.

Je pourrais le faire manuellement pour chaque colonne, mais il y en a des centaines, ce qui signifierait au moins un hachage répété pour chaque colonne.

Je suis perplexe quant à la façon de le faire plus simplement et une seule fois pour chaque colonne possible dans la table d'origine.

En ce moment je fais un tMap ÉNORME et en utilisant beaucoup de recherches: un pour chaque colonne.

Toutes les idées sont appréciées.

-

Quelques idées supplémentaires j'ai eu:
1) Est-il possible de connaître le nom du lien se joindre à deux composants? Je pourrais alors réutiliser la même connexion et filtrer plus facilement sur le tMap

+2

Il vaudrait mieux mettre votre solution en guise de réponse plutôt que de modifier la question. SO permet aux gens de répondre à leur propre question. –

+0

fait, m'a pris assez longtemps :) –

Répondre

1

Je pourrais le résoudre en utilisant tMemorizeRows, en sauvegardant la totalité de la table de mappage en mémoire à l'aide d'un tJavaFlex, puis en les lisant à l'aide d'une routine. Ce que j'ai fait était de mémoriser toute la table, j'avais seulement une table, avec trois colonnes, la première indiquant le type de mappage que je devais faire, la seconde étant le code original, et la troisième étant le remplacement code. Une fois les données mémorisées, j'ai utilisé un tJavaFlex pour créer trois listes, une pour chaque colonne, puis déplacer ces listes vers la carte de variables globales.

Ensuite, j'ai créé une routine qui reçoit les trois listes plus deux codes, le premier est le nom de mappage (premier filtre de colonne) et le second est le code d'origine (filtre de deuxième colonne). En utilisant les deux je pourrais identifier la position du code de remplacement, et le retourner. Enfin, en lisant le flux de données principal, en utilisant un tMap, j'ai créé une variable pour chaque valeur distincte de la première colonne (c'est-à-dire une pour chaque type de mappage), puis j'ai appelé la routine développée en utilisant code oriinal + le nom de mappage.

Le code i utilisé dans le tMemorizeRows était:

CODE DÉBUT

java.util.Set<String> iLista; 
java.util.List<String> lLOV=new java.util.ArrayList<String>(); 
java.util.List<String> lS6=new java.util.ArrayList<String>(); 
java.util.List<String> lS8=new java.util.ArrayList<String>(); 

CODE PRINCIPAL

lLOV.add(LOV_tMemorizeRows_1[icount]); 
lS6.add(S6_NAME_tMemorizeRows_1[icount]); 
lS8.add(S8_NAME_tMemorizeRows_1[icount]); 

FIN CODE

globalMap.put("lLOV",lLOV); 
globalMap.put("lS6",lS6); 
globalMap.put("lS8",lS8); 

CODE DE ROUTINE

/* 
* Toma los valores generados de la LOV y matchea con S8, requiere la ejecucion del job 
* Genericos\GeneradorLOV 
* 
* {talendTypes} String | String 
* 
* {Category} MigracionDatos 
* 
* {param} string(entrada.LOV) Identifica el tipo de LOV 
* 
* {param} string(entrada.S6_NAME) Indica el valor del campo en Siebel 6 
* 
* {param} ((java.util.List<String>) globalMap.get("lLOV")) 
* 
* {param} ((java.util.List<String>) globalMap.get("lS6")) 
* 
* {param} ((java.util.List<String>) globalMap.get("lS8")) 


* 
*/ 
    public static String calculaLOV(String CampoLOV, String CampoS6, java.util.List<String> listaLOV, java.util.List<String> listaS6,java.util.List<String> listaS8 ) { 
     /* 
     * java.util.List<String> listaLOV = (java.util.List<String>) globalMap.get("lLOV"); 
     * java.util.List<String> listaS6 = (java.util.List<String>) globalMap.get("lS6"); 
     * java.util.List<String> listaS8 = (java.util.List<String>) globalMap.get("lS8"); 
     */ 

     String C1 = CampoLOV; 
     String C2 = CampoS6; 

     int posicionC1 = listaLOV.indexOf(C1); 

     // encontró el LOV 
     if(posicionC1 >= 0) { 

     java.util.List<String> listaS6_Iterada = new java.util.ArrayList<String>(); 

     // Genera la lista intermedia con los valores 
     for (int contador = posicionC1; contador < listaLOV.size() ; contador++) { 
      listaS6_Iterada.add(listaS6.get(contador)); 
      if(!listaLOV.get(contador).toString().equals(C1)) {break;} 
     } 

     int posicionC2 = listaS6_Iterada.indexOf(C2); 
     if(posicionC2 >= 0) { 

      int posicionFinal = posicionC1 + posicionC2; 

      return listaS8.get(posicionFinal); 
     } else { 
      return ""; 
     } 
     } else { 
     return ""; 
     } 
    }