Beruflich Dokumente
Kultur Dokumente
Carrire
La vie du blog
BI experience
la BI en gnral
Dfinitions
Datawarehouse
Mode projet
News
ETL
SSIS
Talend
Autre
Reporting
SSRS
Reporting open source
Sharepoint
BO
SSAS
Autre
SGBD
SQL
BDD
Data management
Big data
Data quality
Master Data Management
Infrastructure
vnements
Depuis la version 4.1.2, Talend a sorti une option assez remarquable :le Dynamic Schema
Je vous propose dans ce post de dtailler la dmarche que nous avons adopte pour lalimentation de notre infocentre : copie des diffrentes bases de donnes de la
socit partir desquelles le datawarehouse est aliment.
Un simple job sera ralis pour amener les donnes dune base de donnes source vers une base de donnes cible :
Voici loption en question que vous pourrez utiliser dans votre input:
Et si vous avez des rgles de gestion ajouter nhsitez pas avec le tJavaFlex :
http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 1/5
02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience
/**lexemple de traitement en plus lisible**/
for(int i = 0; i < row3.dyn_Col.metadatas.size(); i++) { row3.dyn_Col.metadatas.get(i).setName(row3.dyn_Col.metadatas.get(i).getName().toLowerCase());
}
Ce job, dcrit ci-dessus, est appel ainsi par un job pre qui lui donne le contexte contenant le nom de la table courante migrer :
Linput requte sur une table de paramtrage. En effet nous navons pas forcment besoin de toutes les tables de toutes les bases de donnes. Donc travers une table
de paramtrage nous choisissons celle que lon veut migrer :
Ce job pre appelle aussi un autre sous job qui lui va permettre de migrer les indexes :
Donc pour chaque table on fera un appel une routine (code quil y a dans le tJava):
Et en bonus voici la routine que nous avons cre qui selon la base de donnes (Oracle, Posgres, SQL Server 2000 ou SQL Server 2005) va requter dans la bonne
table systme :
http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 2/5
02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience
else if(m.containsKey(rs.getString(1)))
{
List l=(List)m.get(rs.getString(1));
l.add(rs.getString(2));
m.put(rs.getString(1),l);
}
}
StringBuffer sb=new StringBuffer();
for (Iterator i = m.keySet().iterator() ; i.hasNext();){
String key = (String)i.next();
sb.append( CREATE INDEX );
sb.append( IDX_ +key);
sb.append( ON +dest_nomtable+ ( );
List l=(List)m.get(key);
for(int j=0;j<l.size();j++)
{
sb.append(l.get(j));
if(j!=l.size()-1)
sb.append( , );
}
sb.append( );\n );
}
try{
Statement bla=dest_connect.createStatement();
System.out.println( +sb.toString());
bla.execute(sb.toString());
}
catch (java.sql.SQLException e)
{
//System.out.println(dest_nomtable);
System.out.println(e.getMessage());
}
dest_connect.commit();
//System.out.println(dest_nomtable);
}
if(org_connect.getMetaData().getDatabaseProductName().equalsIgnoreCase( PostgreSQL ))
{
Statement stat = org_connect.createStatement();
ResultSet rs=stat.executeQuery( SELECT indkey as colonne_index,pci.relname as nom_index,pct.relname as nom_table from pg_index as pi
+ , pg_class as pci, pg_class as pct
+ where pci.oid=pi.indexrelid
+ and pct.oid=pi.indrelid and pct.relname not like pg_% and pct.relname= +org_nomtable+ );
while( rs.next())
{
String s=rs.getString(1);
java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(s, );
List <Integer> num_columns=new ArrayList();
while ( tokenizer.hasMoreTokens() ) {
num_columns.add(Integer.parseInt(tokenizer.nextToken()));
}
Statement sel=org_connect.createStatement();
ResultSet rsset=sel.executeQuery( SELECT * from +org_nomtable+ LIMIT 1);
StringBuffer sb=new StringBuffer();
sb.append( CREATE INDEX +rs.getString(2)+ ON +dest_nomtable+ ( );
Iterator i=num_columns.iterator();
while(i.hasNext())
{
sb.append(rsset.getMetaData().getColumnLabel((Integer)i.next()));
if(i.hasNext())
sb.append( , );
}
sb.append( ) ;\n );
Statement bla=dest_connect.createStatement();
bla.execute(sb.toString());
dest_connect.commit();
bla.close();
}
}
if(org_connect.getMetaData().getDatabaseProductName().equalsIgnoreCase( Oracle ))
{
Statement stat = org_connect.createStatement();
ResultSet rs=stat.executeQuery( SELECT col.index_name,col.column_name FROM all_indexes cons INNER JOIN all_ind_columns col ON cons.owner = col.index_owner AND
cons.index_name = col.index_name WHERE OWNER = AEFE AND cons.table_name=\ +org_nomtable+ \ );
Map m =new HashMap();
Map m_key=new HashMap();
while(rs.next())
{
if(!m.containsKey(rs.getString(1)))
{
List l = new ArrayList();
l.add(rs.getString(2));
m.put(rs.getString(1),l);
m_key.put(rs.getString(1), rs.getString(1));
}
else if(m.containsKey(rs.getString(1)))
{
List l=(List)m.get(rs.getString(1));
l.add(rs.getString(2));
m.put(rs.getString(1),l);
}
}
StringBuffer sb=new StringBuffer();
for (Iterator i = m.keySet().iterator() ; i.hasNext();){
String key = (String)i.next();
sb.append( CREATE INDEX );
sb.append( IDX_ +key);
http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 3/5
02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience
sb.append( ON +dest_nomtable+ ( );
List l=(List)m.get(key);
for(int j=0;j<l.size();j++)
{
sb.append(l.get(j));
if(j!=l.size()-1)
sb.append( , );
}
sb.append( );\n );
}
Statement bla=dest_connect.createStatement();
System.out.println( +sb.toString());
bla.execute(sb.toString());
dest_connect.commit();
}}}
Trs important, si un problme de typage persiste nhsitez pas modifier les fichiers de mapping dans :
typage BDD source => typage JAVA => typage BDD cible
Exemple dutilisation :
ma base de donnes source est SQL server et ma base de donnes cible est postgres :
La dmarche sera donc daller dans MSSQL_mapping.xml et de regarder la rubrique : <dbToTalendTypes> pour voir en quel type Java les typages de ma base de
donnes MSSQL seront transforms. Ensuite il faudra regarder dans postgres_mapping.xml pour regarder les typages par dfault que propose Talend dans la
rubrique <talendToDbTypes> pour la retransformation des types JAVA en typages postgres.
Si ces fichiers sont modifis il faudra bien sr les rpercuts sur tous les clients TIS et sur le serveur dans les workspaces dans:
Jespre que ce post vous aura permis de voir les possibilits quoffre la solution Talend pour ce genre de besoin.
Catgories : Talend | Mots-cls : Base de donnes, dynamic schema, Talend, TIS | Lien Permanent
Un Commentaire
Rpondre
1.
Aurelien
27 mars 2012 21 h 19 min
http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 4/5
02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience
Ce topic est super !
Mais pourrait-on aller plus loin en effectuant un update/insert ?
Jai essay, mais bloc toujours sur le fait de ne pas pouvoir dfinir en variable de context le nom dun champ dans un schema.
Auriez-vous une ide ?
Merci
Laisser un commentaire
Champs Requis *.
Nom *
Adresse de contact *
Site web
Message *
Laisser un commentaire
Article Prcdent
Article Suivant
Recherche
Rechercher
Archives
Choisir un mois
Bienvenue, BI experience tentera, je l'espre, d'apporter des explications sur des concepts et astuces BI que je rencontre au fil du temps. En esprant vous aider,
n'hsitez pas, commentez. Bonne visite! khiali.maryam@yahoo.fr
Commentaires rcents
Flux RSS
Femme ingnieure
Reportservertempdb grossit de manire significative
SQL server Index et statistiques
http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 5/5