4

我正在 Talend 做一个数据迁移项目,其中一项任务是我需要处理一个包含许多列的大表并将(旧)数据映射到新模型的不同值。
我有一个包含三列的唯一映射表。

例子:

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

这样我就可以使用“列名”来引用与我需要映射的列相关的值。

使用“列名”在映射表中使用旧值作为查找:当旧值匹配时,它返回新值。

我可以为每一列手动执行此操作,但有数百个,这意味着每列至少重复一个哈希。

我对如何更简单地执行此操作感到困惑,并且对于原始表中的每个可能列仅执行一次。

现在我正在做一个巨大的 tMap 并使用大量查找:每列一个。

任何想法表示赞赏。

-

我有一些额外的想法:
1)有没有办法知道连接两个组件的链接名称?然后我可以更轻松地重用相同的连接并在 tMap 上进行过滤

4

1 回答 1

2

我可以使用 tMemorizeRows 解决它,使用 tJavaFlex 将整个映射表保存到内存中,然后使用例程读取它们。

我所做的是,记住整张表,我只有一张表,三列,第一列表示我必须做的映射类型,第二列是原始代码,第三列是替换代码。

记住数据后,我使用 tJavaFlex 创建了三个列表,每列一个,然后将这些列表移动到全局变量映射中。

然后我创建了一个接收所有三个列表和两个代码的例程,第一个是映射名称(第一列过滤器),第二个是原始代码(第二列过滤器)。使用两者我可以查明替换代码的位置,并将其返回。

最后,在使用 tMap 读取主要数据流时,我为第一列的每个不同值创建了一个变量(即,为每种类型的映射创建一个变量),然后调用我使用原始代码开发的例程 +映射名称。

我在 tMemorizeRows 中使用的代码是:

开始代码

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

主要代码

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

结束代码

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

常规代码

/*
 * 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 "";
       }
   }
于 2014-03-13T17:02:30.127 回答