Nós já demonstramos como utilizar variáveis de contexto aqui, e como obter melhores resultados utilizando grupos de contexto e contextos de execução aqui. Hoje irei demonstrar o uso de variáveis globais.
Variáveis globais, no Talend, são variáveis armazenadas em um local denominado globalMap. Através do globalMap podemos definir variáveis de basicamente qualquer tipo e em qualquer momento durante a execução de um job. As variáveis globais são definidas seguindo o conceito key/value.
Mas por quê utilizar variáveis globais e não variáveis de contexto? Eis alguns motivos:
– Variáveis globais são dinâmicas, variáveis de contexto devem ser declaradas previamente.
Não é possível declarar variáveis de contexto programaticamente, em tempo de execução. Com as variáveis globais fica fácil definir variáveis em tempo de execução, dando maiores possibilidades ao desenvolvedor.
– Variáveis de contexto são acessíveis “fora” do job.
Quando você define uma variável de contexto, ela tem um comportamento de “parâmetro de execução”, ou seja, quem executa o job pode alterar o conteúdo das variáveis de contexto, podendo assim alterar o comportamento do job.
E quando não declarar/utilizar variáveis via globalMap?
– Quando você precisar de variáveis compartilhadas em todo o repositório.
– Quando o conteúdo pode ou deve ser parametrizado. Por exemplo, alterar o login de acesso a um database, especificar uma data seleção dos dados, etc.
Mão na Massa
Vamos criar um job simples que executa uma query para obter o MAX() de uma coluna e projeta o resultado. Vamos supor que você necessite do maior ID ou a data da última transação armazenada para então executar uma nova query selecionando os dados com o valor obtido anteriormente, por exemplo. Este é um cenário típico em processos de carga incremental.
1. No primeiro componente – nomeado “DW” – é executada uma query simples para obter o MAX() de uma coluna;
2. No tSegGlobalVar_1 armazenamos o valor obtido:
Simples assim, definimos uma variável denominada “MAX_ID” (Key) e atribuímos o valor retornado na query do passo anterior (Value). Observe que row1 é o nome da linha que traz o resultado da query anterior e que ID é o alias da coluna que definimos no schema do componente anterior.
3. No tJava_1 à frente imprimimos o conteúdo da nova variável criada, assim:
System.out.println( (Long) globalMap.get(“MAX_ID”) );
Destaquei em negrito o que realmente importa. Utilizamos o método get() do globalMap para retornar o conteúdo de qualquer variável, passando como argumento o nome da mesma, neste caso “MAX_ID”.
Aqui é importante um detalhe: Como você pode armazenar qualquer tipo de objeto no globalMap, o método get() não tem como “saber” o tipo do retorno da chave (Key) especificada e por isso ele retorna um Object, que é um tipo que “aceita qualquer coisa”. Você precisa especificar o que aquele método está retornando naquele momento e por isso acrescentamos um (Long) antes de mais nada, que é exatamente o mesmo tipo que definimos no schema do primeiro componente onde executamos o select.
4. Por fim selecionamos os dados na query executada no componente “ORACLE” aplicando o mesmo conceito, e então partimos para a carga dos dados. A query fica assim:
“SELECT
*
FROM TABELA_ORIGEM
WHERE ID > ” + (Long)globalMap.get(“MAX_ID”)
Apenas concatenamos a variável à query e voilà!
Um abraço!