{"id":1033,"date":"2012-07-30T13:59:31","date_gmt":"2012-07-30T13:59:31","guid":{"rendered":"http:\/\/leonardocotta.com.br\/blog\/?p=1033"},"modified":"2012-07-30T13:59:31","modified_gmt":"2012-07-30T13:59:31","slug":"tutorial-kettle-pentaho-data-integration","status":"publish","type":"post","link":"https:\/\/leonardocotta.com.br\/?p=1033","title":{"rendered":"Tutorial Kettle &#8211; Pentaho Data Integration"},"content":{"rendered":"<address>Pentaho Data Integration (PDI, tamb\u00e9m chamado Kettle) \u00e9 um componente da su\u00edte do Pentaho respons\u00e1vel pelos processos de Extra\u00e7\u00e3o, Transforma\u00e7\u00e3o e Carga (ETL). Apesar de ferramentas de ETL serem usadas em projetos de data warehouse, PDI pode tamb\u00e9m ser usado para:<\/address>\n<address>* Migra\u00e7\u00e3o de dados entre aplica\u00e7\u00f5es\/banco de dados<br \/>\n* Exportar dados de banco de dados para arquivos texto<br \/>\n* Carregar massivamente dados em banco de dados<br \/>\n* Data Cleansing \u2013 disciplina de qualidade\/limpeza de dados de data warehouse<br \/>\n* Integra\u00e7\u00e3o de aplica\u00e7\u00f5es.<br \/>\nPDI \u00e9 f\u00e1cil de usar. Todos os processos s\u00e3o criados com uma ferramenta gr\u00e1fica onde voc\u00ea especifica o que fazer sem escrever nenhuma linha de c\u00f3digo. Por conta disso voc\u00ea pode dizer que PDI \u00e9 orientado a metadado.<\/address>\n<address>O PDI pode ser usado como uma aplica\u00e7\u00e3o independente ou como parte da su\u00edte do Pentaho. Como uma ferramenta de ETL, \u00e9 a mais popular ferramenta open source dispon\u00edvel. PDI suporta um vasto conjunto de formatos de entrada e sa\u00edda de dados, incluindo arquivos texto, arquivos .xls (Excel) al\u00e9m de banco de dados comerciais e open source. Al\u00e9m disso, a capacidade de transforma\u00e7\u00e3o de dados do PDI permite que voc\u00ea manipule dados com pouqu\u00edssimas limita\u00e7\u00f5es.<\/address>\n<address>\u00a0<\/address>\n<address><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem1.jpg\" alt=\"\" width=\"654\" height=\"453\" border=\"0\" \/><br \/>\nAtrav\u00e9s de um simples exemplo \u201cHello World\u201d, esse tutorial mostrar\u00e1 como \u00e9 f\u00e1cil trabalhar com o PDI e mostrar\u00e1 tamb\u00e9m o b\u00e1sico, preparando voc\u00ea para outras transforma\u00e7\u00f5es mais complexas.<\/address>\n<address><!--more--><\/address>\n<p>&nbsp;<\/p>\n<address><strong>Instalando o Kettle<\/strong><\/address>\n<address>Voc\u00ea pode baixar o PDI aqui\u00a0<a href=\"http:\/\/sourceforge.net\/projects\/pentaho\/files\/Data%20Integration\/3.2.0-stable\/\">http:\/\/sourceforge.net\/projects\/pentaho\/files\/Data Integration\/3.2.0-stable\/<\/a>. Enquanto esse tutorial \u00e9 traduzido e atualizado o Kettle est\u00e1 na sua vers\u00e3o 3.2.0, ent\u00e3o o arquivo que deve ser baixado \u00e9 o pdi-ce-3.2.0-stable.zip para Windows e pdi-ce-3.2.0-stable.tar.gz para outras plataformas.<\/address>\n<p>&nbsp;<\/p>\n<address><strong>Pr\u00e9-requisitos<\/strong><\/address>\n<p>&nbsp;<\/p>\n<address>O Kettle requer o runtime do Java para rodar (JRE), vers\u00e3o 1.5 ou mais nova. O JRE pode ser baixado gratuitamente no site http:\/\/java.sun.com\/.<\/address>\n<p>&nbsp;<\/p>\n<address>Instala\u00e7\u00e3o<\/address>\n<address>O PDI n\u00e3o requer instala\u00e7\u00e3o. Apenas descompacte o arquivo .zip dentro de uma pasta qualquer. Para sistemas operacionais baseados no Unix \u00e9 necess\u00e1rio fazer com que o script se torne execut\u00e1vel usando o seguindo comando:<\/address>\n<p>&nbsp;<\/p>\n<address>cd Kettle<\/address>\n<address>chmod +x *.sh<\/address>\n<address>\u00a0<\/address>\n<p>&nbsp;<\/p>\n<address><strong>Introdu\u00e7\u00e3o ao Spoon<\/strong><br \/>\nO Spoon \u00e9 a ferramenta gr\u00e1fica com que se desenha e testa todo processo do PDI. Os outros componentes executam os processos desenhados com o Spoon. No Spoon voc\u00ea constr\u00f3i Jobs e Transformations. O PDI oferece dois m\u00e9todos de salvar seus arquivos:<\/address>\n<p>&nbsp;<\/p>\n<ol>\n<li>\n<address>Reposit\u00f3rio em banco de dados<\/address>\n<\/li>\n<li>\n<address>Arquivos<\/address>\n<\/li>\n<\/ol>\n<address>Se o modo de reposit\u00f3rio for escolhido, o mesmo deve ser criado na primeira vez que o Spoon \u00e9 executado. Se o m\u00e9todo de arquivo for escolhido, os Jobs s\u00e3o salvos em arquivos de extens\u00e3o .kjb e tranformations s\u00e3o salvos em arquivos de extens\u00e3o .ktr. Nesse tutorial \u00e9 usado o modo de arquivo.<\/address>\n<p>&nbsp;<\/p>\n<address>Iniciando o Spoon<\/address>\n<address>O arquivo spoon.bat no Windows ou spoon.sh nos sistemas operacionais baseados no Unix, inicia o spoon.<br \/>\nSer\u00e1 exibida a janela de boas vindas. V\u00e1 ao menu Edit e clique em Options. Na janela de op\u00e7\u00f5es \u00e9 poss\u00edvel v\u00e1rias configura\u00e7\u00f5es gerais, inclusive caracter\u00edsticas visuais. Caso algo for modificado \u00e9 necess\u00e1rio iniciar o Spoon novamente para que as mudan\u00e7as tenham efeito.<\/address>\n<p>&nbsp;<\/p>\n<address>Exemplo Hello World<\/address>\n<address>Apesar de se tratar de um exemplo simples, ir\u00e1 introduzir alguns fundamentos do PDI:<\/address>\n<ul>\n<li>\n<address>Trabalhando com o Spoon<\/address>\n<\/li>\n<li>\n<address>Transforma\u00e7\u00f5es<\/address>\n<\/li>\n<li>\n<address>O que s\u00e3o Steps e Hops<\/address>\n<\/li>\n<li>\n<address>Vari\u00e1veis predefinidas<\/address>\n<\/li>\n<li>\n<address>Visualizando e executando a partir de Spoon<\/address>\n<\/li>\n<li>\n<address>Executando transforma\u00e7\u00f5es a partir da linha de comando com o Pan<\/address>\n<\/li>\n<\/ul>\n<address>Vis\u00e3o Geral<\/address>\n<address>Vamos supor que voc\u00ea tenha um arquivo .csv contendo uma lista de nomes e \u00e9 necess\u00e1rio criar um arquivo .xml contendo cumprimentos para cada um dos nomes. Se o conte\u00fado do arquivo .csv \u00e9 :<\/address>\n<p>&nbsp;<\/p>\n<address>last_name, name<\/address>\n<address>Suarez,Maria<\/address>\n<address>Guimaraes,Joao<\/address>\n<address>Rush,Jennifer<\/address>\n<address>Ortiz,Camila<\/address>\n<address>Rodriguez,Carmen<\/address>\n<address>da Silva,Zoe<\/address>\n<p>&nbsp;<\/p>\n<address>Essa deveria ser a sa\u00edda num arquivo .xml:<\/address>\n<address>&#8211; &lt;Rows&gt;<\/address>\n<address>&#8211; &lt;row&gt; \u00a0&lt;msg&gt;Hello, Maria!&lt;\/msg&gt; \u00a0&lt;\/row&gt;<\/address>\n<address>&#8211; &lt;row&gt; \u00a0&lt;msg&gt;Hello, Joao!&lt;\/msg&gt; \u00a0&lt;\/row&gt; \u00a0&#8211; &lt;row&gt; \u00a0&lt;msg&gt;Hello, Jennifer!&lt;\/msg&gt; \u00a0&lt;\/row&gt; \u00a0&#8211; &lt;row&gt; \u00a0&lt;msg&gt;Hello, Camila!&lt;\/msg&gt; \u00a0&lt;\/row&gt; \u00a0&#8211; &lt;row&gt; \u00a0&lt;msg&gt;Hello, Carmen!&lt;\/msg&gt; \u00a0&lt;\/row&gt; \u00a0&#8211; &lt;row&gt; \u00a0&lt;msg&gt;Hello, Zoe!&lt;\/msg&gt; \u00a0&lt;\/row&gt;<\/address>\n<address>&lt;\/Rows&gt;<\/address>\n<address>A cria\u00e7\u00e3o desse arquivo .xml ser\u00e1 o objetivo dessa primeira transforma\u00e7\u00e3o.<br \/>\nUma transforma\u00e7\u00e3o \u00e9 formada por Steps conectados por Hops. Esses Steps e Hops formam um caminho por onde o dado trafega. Por isso que \u00e9 dito que uma transforma\u00e7\u00e3o \u00e9 data-flow oriented, ou seja, orientada a fluxo de dados.<\/address>\n<p>&nbsp;<\/p>\n<address>Preparando Ambiente<\/address>\n<address>Antes de come\u00e7ar a construir a transforma\u00e7\u00e3o, crie uma pasta para os arquivos desse tutorial. Nessa pasta ser\u00e3o salvos todos os arquivos desse tutorial. Ent\u00e3o crie um arquivo .csv como mostrado acima e salve o arquivo como list.csv.<\/address>\n<p>&nbsp;<\/p>\n<address><strong>Etapas da cria\u00e7\u00e3o da transforma\u00e7\u00e3o<\/strong><\/address>\n<p>&nbsp;<\/p>\n<address>A transforma\u00e7\u00e3o proposta ser\u00e1 completada em tr\u00eas atividades:<br \/>\n1.\u00a0\u00a0\u00a0 Criar a transforma\u00e7\u00e3o<br \/>\n2.\u00a0\u00a0\u00a0 Construir o esqueleto da transforma\u00e7\u00e3o usando Steps e Hops.<br \/>\n3.\u00a0\u00a0\u00a0 Configurar os Steps especificando seu comportamento.<\/address>\n<p>&nbsp;<\/p>\n<address>Criar a transforma\u00e7\u00e3o<\/address>\n<address>1.\u00a0\u00a0\u00a0 Clicar em New, selecionar Transformation. Tamb\u00e9m acess\u00edvel atrav\u00e9s do menu File. E ainda atrav\u00e9s do Ctrl-N<br \/>\n2.\u00a0\u00a0\u00a0 Selecionar o menu Transformation e clicar em Configuration.<br \/>\n3.\u00a0\u00a0 Na janela seguinte, \u00e9 poss\u00edvel definir v\u00e1rias configura\u00e7\u00f5es da transforma\u00e7\u00e3o. Nesse caso, apenas d\u00ea um nome e uma descri\u00e7\u00e3o para a transforma\u00e7\u00e3o.<br \/>\n4.\u00a0\u00a0\u00a0 Salve a transforma\u00e7\u00e3o na pasta criada para o tutorial com o nome de hello. Isso criar\u00e1 um arquivo hello.ktr.<\/address>\n<address>Construir o esqueleto da transforma\u00e7\u00e3o usando Steps e Hops<\/address>\n<address>Um Step, ou passo em portugu\u00eas, \u00e9 menor unidade dentro de uma transforma\u00e7\u00e3o. Uma larga variedade de steps est\u00e1 dispon\u00edvel no Kettle. Esses steps est\u00e3o agrupados em categorias como Input e Output al\u00e9m de v\u00e1rias outras. Cada Step foi desenhado para completar uma fun\u00e7\u00e3o espec\u00edfica como ler um par\u00e2metro ou normalizar um conjunto de dados.<br \/>\nUm Hop \u00e9 uma representa\u00e7\u00e3o gr\u00e1fica do dado transitando entre dois steps, com uma origem e um destino. O dado que transita atrav\u00e9s do Hop consiste nos dados de sa\u00edda do Step, op\u00e7\u00e3o identificada no Kettle como Output Data. Esse mesmo dado \u00e9 considerado o dado de entrada do Step destino, Input Data. Um Hop tem apenas uma origem e apenas um destino, no entanto mais de um Hop pode ter como origem o mesmo Step. Quando isso acontece, o dado de sa\u00edda pode ser copiado ou distribu\u00eddo para v\u00e1rios destinos. Tamb\u00e9m mais de um Hop pode ter como destino o mesmo Step. Nesse caso, o Step destino deve ter a habilidade de fazer um merge entre os dados de entrada de diferentes steps.<\/address>\n<p>&nbsp;<\/p>\n<address>Essa transforma\u00e7\u00e3o deve:<\/address>\n<p>&nbsp;<\/p>\n<address>1.\u00a0\u00a0\u00a0 Ler o arquivo .csv<br \/>\n2.\u00a0\u00a0\u00a0 Construir os cumprimentos<br \/>\n3.\u00a0\u00a0\u00a0 Salvar os cumprimentos no arquivo .xml<\/address>\n<p>&nbsp;<\/p>\n<address>Para cada um desses itens, ser\u00e1 usado um Step diferente, como mostrado abaixo:<\/address>\n<p>&nbsp;<\/p>\n<address><img decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem2.jpg\" alt=\"\" border=\"0\" \/><br \/>\nNesse exemplo, a rela\u00e7\u00e3o entre tarefas a ser executadas e steps \u00e9 de um para um, mas nem sempre ocorre assim.<\/address>\n<p>&nbsp;<\/p>\n<address>Como iniciar a cria\u00e7\u00e3o da transforma\u00e7\u00e3o:<\/address>\n<address>1.\u00a0\u00a0\u00a0 A esquerda da janela do Spoon fica a paleta de steps, Steps Palette. Selecione categoria Input.<br \/>\n2.\u00a0\u00a0\u00a0 Arraste o CSV file input e solte na \u00e1rea de trabalho a direita.<br \/>\n3.\u00a0\u00a0\u00a0 Selecione a categoria Scripting.<br \/>\n4.\u00a0\u00a0\u00a0 Arraste Modified JavaScript Value para a \u00e1rea de trabalho.<br \/>\n5.\u00a0\u00a0\u00a0 Selecione a categoria Output.<br \/>\n6.\u00a0\u00a0\u00a0 Arraste o Step XML Output para a \u00e1rea de trabalho.<br \/>\nAgora \u00e9 necess\u00e1rio fazer a liga\u00e7\u00e3o entre o Step CSV file input com o Step Modified JavaScript Value. Para isso crie um Hop:<br \/>\n1.\u00a0\u00a0\u00a0 Selecione o primeiro Step<br \/>\n2.\u00a0\u00a0\u00a0 Segure a tecla Shift e arraste o \u00edcone para o segundo Step.<br \/>\n3.\u00a0\u00a0\u00a0 Pelo mesmo processo, fa\u00e7a a liga\u00e7\u00e3o entre Modified Java Script Value e o XML Output<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem3.jpg\" alt=\"\" border=\"0\" \/><\/address>\n<p>&nbsp;<\/p>\n<address>Especificando o comportamento do Step<\/address>\n<address>Todo Step tem uma janela de configura\u00e7\u00e3o. Essa janela varia de acordo com a funcionalidade do Step e a categoria a qual pertence. Por outro lado, o nome do Step \u00e9 sempre exibido para todos os casos e deve ser preenchido cuidadosamente, pois \u00e9 o nome pelo qual o Step ser\u00e1 reconhecido ao longo de todo o ETL.<\/address>\n<address>Configurando o Step CSV file input<\/address>\n<address>1.\u00a0\u00a0\u00a0 Clique duas vezes no Step CSV file input.<br \/>\n2.\u00a0\u00a0\u00a0 Nessa janela voc\u00ea deve indicar a localiza\u00e7\u00e3o, formato e conte\u00fado do arquivo.<br \/>\n3.\u00a0\u00a0\u00a0 Substitua o nome padr\u00e3o por um mais representativo da fun\u00e7\u00e3o desse Step. Nesse caso name list.<br \/>\n4.\u00a0\u00a0\u00a0 No campo Filename, escreva o nome e a localiza\u00e7\u00e3o do arquivo.<br \/>\n5.\u00a0\u00a0\u00a0 Clique em Get Fields para adicionar a lista com os nomes das colunas do arquivo de entrada. Por padr\u00e3o o Kettle assume que o arquivo tem cabe\u00e7alho (checkbox Header row present est\u00e1 selecionado)<br \/>\n6.\u00a0\u00a0\u00a0 Agora a grid cont\u00e9m os nomes das colunas do arquivo. Last_name e name. A janela deveria estar mais ou menos assim:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem4.jpg\" alt=\"\" width=\"664\" height=\"347\" border=\"0\" \/><\/address>\n<p>&nbsp;<\/p>\n<address>7.\u00a0\u00a0\u00a0 Desmarque a op\u00e7\u00e3o lazy conversion caso esteja marcada.<br \/>\n8.\u00a0\u00a0\u00a0 Clique em Preview para assegurar que o arquivo est\u00e1 sendo lido como esperado. Uma janela ir\u00e1 aparecer com um conjunto de dados para visualiza\u00e7\u00e3o.<br \/>\n9.\u00a0\u00a0\u00a0 Clique em OK para finalizar as altera\u00e7\u00f5es do Step.<\/address>\n<address>Configurando o Step Modified JavaScript Value<\/address>\n<address>1.\u00a0\u00a0\u00a0 Clique duas vezes no Step Modified JavaScript Value.<br \/>\n2.\u00a0\u00a0\u00a0 Essa janela \u00e9 diferente da do Step anterior. Nessa o PDI permite que seja escrito c\u00f3digo JavaScript. Esse Step ser\u00e1 usado para escrever a mensagem de cumprimento \u201cHello,\u201d concatenado com cada um dos nomes do arquivo.<br \/>\n3.\u00a0\u00a0\u00a0 D\u00ea o nome de Greeting para esse Step.<br \/>\n4.\u00a0\u00a0\u00a0 Ao lado esquerdo da janela fica o conjunto de fun\u00e7\u00f5es que podem ser utilizadas no c\u00f3digo al\u00e9m dos campos de entrada e sa\u00edda. Nesse exemplo existem dois campos: _name e name. Escreva o seguinte c\u00f3digo:<\/address>\n<address>var msg = &#8216;Hello, &#8216; + name + &#8220;!&#8221;;<\/address>\n<address>5.\u00a0\u00a0\u00a0 No painel inferior \u00e9 poss\u00edvel direcionar qualquer vari\u00e1vel criada ou manipulada no c\u00f3digo como campo de sa\u00edda. Nesse caso foi criada a vari\u00e1vel msg, e para que a mesma seja inclu\u00edda como dado de sa\u00edda, \u00e9 preciso adicion\u00e1-la no grid:<\/address>\n<address><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem5.jpg\" alt=\"\" width=\"658\" height=\"445\" border=\"0\" \/><\/address>\n<address>6.\u00a0\u00a0\u00a0 Clique em Ok para finalizar a configura\u00e7\u00e3o do Step.<br \/>\n7.\u00a0\u00a0\u00a0 Para visualizar os dados de sa\u00edda e qual novo campo foi criado, selecione o Step que foi configurado, clique com o bot\u00e3o direito e v\u00e1 at\u00e9 a op\u00e7\u00e3o Input Fields.\u00a0 Essa op\u00e7\u00e3o mostrar\u00e1 os campos que entram no Step, campos que v\u00eaem de Step anterior. Clicando em Output Fields mostra os campos de sa\u00edda, inclusive os criados nesse Step. Nessa ultima op\u00e7\u00e3o, al\u00e9m dos campos last_name e name, voc\u00ea ver\u00e1 tamb\u00e9m o novo campo msg.<\/address>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<address>Configurando o Step XML Output<\/address>\n<address>1.\u00a0\u00a0\u00a0 Clique duas vezes no Step XML Output. Nessa janela deve ser configurado a localiza\u00e7\u00e3o e o nome do arquivo de sa\u00edda e quais dos campos ser\u00e3o inclu\u00eddos no arquivo.<br \/>\n2.\u00a0\u00a0\u00a0 D\u00ea o nome de File with Greetings para o Step.<br \/>\n3.\u00a0\u00a0\u00a0 No campo File, digite:<br \/>\nHello<br \/>\n4.\u00a0\u00a0\u00a0 Clique em Get Fields na aba Fields para preencher o grid\u00a0 com o nome dos campos vindos do Step anterior. Nesse caso deixe apenas a msg. Apague os campos name e last_name.<br \/>\n5.\u00a0\u00a0\u00a0 Salve a transforma\u00e7\u00e3o.<\/address>\n<address><img decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem6.jpg\" alt=\"\" border=\"0\" \/><\/address>\n<address>Como isso funciona?<\/address>\n<address>Quando uma transforma\u00e7\u00e3o \u00e9 executada, quase todos os Steps s\u00e3o executados simultaneamente e assincronamente. As linhas de dados fluem atrav\u00e9s dos Steps \u201ccada uma por si\u201c. Cada registro processado deixa o Step de origem para o destino sem esperar pelos demais registros. Essa \u00e9 uma caracter\u00edstica importante para se manter em mente.<br \/>\nO exemplo est\u00e1 quase completo. A transforma\u00e7\u00e3o l\u00ea o arquivo de entrada, cria mensagens para cada registro atrav\u00e9s do c\u00f3digo javascript e envia as mensagens para o arquivo de sa\u00edda. Esse \u00e9 um pequeno exemplo com poucos registros, por conta disso \u00e9 dif\u00edcil notar a caracter\u00edstica ass\u00edncrona em a\u00e7\u00e3o no Kettle. Tenha em mente que ao mesmo tempo em que um registro est\u00e1 sendo gravado no arquivo de sa\u00edda, outro pode estar saindo do primeiro Step da transforma\u00e7\u00e3o.<\/address>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<address><strong>Verificando, pr\u00e9-visualizando e executando.<\/strong><\/address>\n<address>1.\u00a0\u00a0\u00a0 Antes de executar a Transforma\u00e7\u00e3o, cheque se tudo est\u00e1 configurado propriamente clicando em Verify. O Spoon vai\u00a0 verificar se a transforma\u00e7\u00e3o \u00e9 sintaticamente correta e vai procurar por Steps sem Hops e conex\u00f5es n\u00e3o existentes. Se tudo estiver em ordem a transforma\u00e7\u00e3o esta pronta para testar a sa\u00edda de dados.<br \/>\n2.\u00a0\u00a0\u00a0 Selecione o Step contendo o c\u00f3digo JavaScript e clique no bot\u00e3o preview. A janela abaixo ser\u00e1 exibida:<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem7.jpg\" alt=\"\" border=\"0\" \/><\/address>\n<address>3.\u00a0\u00a0\u00a0 Clique em QuickLaunch. Uma janela com uma amostragem dos dados de sa\u00edda desse Step. Se a sa\u00edda est\u00e1 como esperada a transforma\u00e7\u00e3o \u00e9 pronta para ser executada.<br \/>\n4.\u00a0\u00a0\u00a0 Clique em Run.<br \/>\n5.\u00a0\u00a0\u00a0 O Spoon exibir\u00e1 uma janela onde podem ser configurados par\u00e2metros e o n\u00edvel de log gerado pela transforma\u00e7\u00e3o, al\u00e9m de outras informa\u00e7\u00f5es. Clique em Launch.<br \/>\n6.\u00a0\u00a0\u00a0 Uma nova janela ser\u00e1 exibida. A aba de log cont\u00e9m registros da execu\u00e7\u00e3o corrente.<\/address>\n<address>A tabela de log cont\u00e9m informa\u00e7\u00f5es importantes:<\/address>\n<address><strong>Read<\/strong>: N\u00famero de vindo do Step anterior.<br \/>\n<strong>Written<\/strong>: Numero de linhas saindo para o pr\u00f3ximo Step<br \/>\n<strong>Input<\/strong>: O n\u00famero de registros lidos de um arquivo ou tabela de banco de dados.<br \/>\n<strong>Output<\/strong>: N\u00famero de linhas escritas num arquivo ou tabela de banco de dados.<br \/>\n<strong>Errors<\/strong>: Erros da execu\u00e7\u00e3o. Se existe erros, a linha ser\u00e1 exibida em vermelho.<br \/>\nNa aba de log escrito, as linhas informativas de output s\u00e3o mostradas. A \u00faltima linha, caso a transforma\u00e7\u00e3o ocorra bem, ser\u00e1:<\/address>\n<p>&nbsp;<\/p>\n<address>Spoon &#8211; The transformation has finished!!<\/address>\n<address>N\u00e3o havendo nenhum erro, abra o arquivo gerado Hello.xml\u00a0 e verifique o conte\u00fado.<\/address>\n<address>Pan<\/address>\n<address>O Pan permite que transforma\u00e7\u00f5es sejam executadas atrav\u00e9s de janelas de terminais. O arquivo de script \u00e9 o pan.bat no Windows ou pan.sh em outras plataformas. Esses arquivos ficam localizados na pasta de instala\u00e7\u00e3o. Se o arquivo de script for rodado sem nenhum par\u00e2metro, o mesmo retornar\u00e1 uma lista de poss\u00edveis par\u00e2metros e op\u00e7\u00f5es.<\/address>\n<address>Para executar a transforma\u00e7\u00e3o criada anteriormente, execute esse comando:<\/address>\n<address>Pan \/file &lt;Jobs_path&gt;\/Hello.ktr \/norep<\/address>\n<address><strong>\/file<\/strong>\u00a0\u2013 deve preceder o nome do arquivo .ktr<br \/>\n<strong>\/norep<\/strong>\u00a0\u2013 comando que diz ao Kettle para n\u00e3o conectar em reposit\u00f3rio.<br \/>\n<strong>&lt;Jobs_path&gt;\/Hello.ktr<\/strong>\u00a0\u2013 caminho completo de onde se encontra o arquivo. Por exemplo:<\/address>\n<p>&nbsp;<\/p>\n<address>C:\/Pentaho\/Tutorial<\/address>\n<p>&nbsp;<\/p>\n<address>ou<\/address>\n<address>\/home\/PentahoUser\/Tutorial<\/address>\n<address>Se o comando foi executado corretamente a transforma\u00e7\u00e3o rodar\u00e1 da mesma forma em que rodou no Spoon. Nesse caso o log ser\u00e1 exibido no terminal a menos que especificado um arquivo para ser escrito com o log. O formato ser\u00e1 ligeiramente diferente mas a informa\u00e7\u00e3o \u00e9 a mesma que foi exibida no ambiente gr\u00e1fico.<strong>\u00a0<\/strong><\/address>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<address><strong><br \/>\n<\/strong><\/address>\n<address><strong>Refinando o primeiro exemplo<\/strong><\/address>\n<address>Agora que a transforma\u00e7\u00e3o foi criada e executada, o pr\u00f3ximo passo ser\u00e1 melhorar a transforma\u00e7\u00e3o.<\/address>\n<address>Vis\u00e3o Geral<\/address>\n<address>As evolu\u00e7\u00f5es que ser\u00e3o adicionadas a transforma\u00e7\u00e3o s\u00e3o:<\/address>\n<address>a)\u00a0\u00a0\u00a0 A transforma\u00e7\u00e3o ser\u00e1 armazenada numa nova pasta e o nome do arquivo ser\u00e1 informado atrav\u00e9s de par\u00e2metro.<br \/>\nb)\u00a0\u00a0\u00a0 A exist\u00eancia do arquivo de entrada ser\u00e1 validada.<br \/>\nc)\u00a0\u00a0\u00a0 O nome do arquivo de sa\u00edda depender\u00e1 do nome do arquivo de entrada.<\/address>\n<address>Para esses melhoramentos ser\u00e1 necess\u00e1rio:<\/address>\n<ul>\n<li>\n<address>Receber par\u00e2metro<\/address>\n<\/li>\n<li>\n<address>Criar o arquivo de sa\u00edda com os cumprimentos<\/address>\n<\/li>\n<li>\n<address>Checar se o par\u00e2metro n\u00e3o \u00e9 nulo e abortar a transforma\u00e7\u00e3o caso seja.<\/address>\n<\/li>\n<li>\n<address>Checar se o arquivo existe e abortar a transforma\u00e7\u00e3o caso n\u00e3o exista.<\/address>\n<\/li>\n<\/ul>\n<address>Essas tarefas ser\u00e3o completadas atrav\u00e9s de Job. Os Jobs s\u00e3o criados da mesma forma que transforma\u00e7\u00f5es, com componentes conectados atrav\u00e9s de Hops. Por isso se diz que Jobs s\u00e3o orientados a controle de fluxo. As possibilidades de execu\u00e7\u00e3o de um Job v\u00e3o de verificar a exist\u00eancia de um arquivo ou tabela at\u00e9 envio de emails. \u00c9 poss\u00edvel, dentro dos Jobs, executar transforma\u00e7\u00f5es ou outro Job. Como numa transforma\u00e7\u00e3o, cada componente pode ter v\u00e1rios Hops para v\u00e1rios destinos.<\/address>\n<p>&nbsp;<\/p>\n<address>O processo ser\u00e1:<\/address>\n<ul>\n<li>\n<address>Recuperar o par\u00e2metro necess\u00e1rio ser\u00e1 resolvido com uma nova transforma\u00e7\u00e3o.<\/address>\n<\/li>\n<li>\n<address>O par\u00e2metro ser\u00e1 validado atrav\u00e9s do resultado da nova transforma\u00e7\u00e3o.<\/address>\n<\/li>\n<li>\n<address>A exist\u00eancia do arquivo ser\u00e1 validada atrav\u00e9s de um componente do Job.<\/address>\n<\/li>\n<li>\n<address>A maior tarefa do Job ser\u00e1 executada pela transforma\u00e7\u00e3o criada anteriormente na primeira parte do tutorial.<\/address>\n<\/li>\n<\/ul>\n<address>Graficamente o Job \u00e9 representado assim:<\/address>\n<address><img decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem8.jpg\" alt=\"\" border=\"0\" \/><\/address>\n<address>Preparando o ambiente<\/address>\n<address>Nessa parte do tutorial, os arquivos de entrada e sa\u00edda estar\u00e3o numa nova pasta chamada Arquivos. Crie essa pasta e copie o arquivo list.csv para o novo arquivo.<br \/>\nPara evitar que seja necess\u00e1rio escrever o caminho completo toda vez que se referencia a uma pasta ou arquivo, \u00e9 aconselh\u00e1vel criar uma vari\u00e1vel contendo essa informa\u00e7\u00e3o. Para isso edite o arquivo de configura\u00e7\u00e3o kettle.properties localizado em\u00a0<strong>C:Documents and Settings&lt;usu\u00e1rio&gt;.kettle<\/strong>\u00a0no\u00a0 Windows XP\/2000,\u00a0\u00a0<strong>C:Profiles&lt;usu\u00e1rio&gt;.kettle<\/strong>\u00a0no Windows Vista ou\u00a0<strong>*~\/.kettle<\/strong>\u00a0em outras plataformas. Coloque a linha abaixo no final do arquivo, mudando o caminho para a pasta criada para conter os arquivos.<\/address>\n<p>&nbsp;<\/p>\n<address>FILES=\/home\/PentahoUser\/Files<\/address>\n<address>O Spoon l\u00ea este arquivo quando \u00e9 iniciado, portanto para que a altera\u00e7\u00e3o tenha efeito \u00e9 preciso reiniciar o spoon.<\/address>\n<address>As atividades s\u00e3o:<br \/>\n1.\u00a0\u00a0\u00a0 Criar a nova transforma\u00e7\u00e3o<br \/>\n2.\u00a0\u00a0\u00a0 Modificar a transforma\u00e7\u00e3o criada anteriormente.<br \/>\n3.\u00a0\u00a0\u00a0 Criar o Job.<\/address>\n<address><strong><br \/>\n<\/strong><\/address>\n<address>Criando a nova transforma\u00e7\u00e3o<\/address>\n<address>1.\u00a0\u00a0\u00a0 Crie uma nova transforma\u00e7\u00e3o da mesma forma que foi feito na primeira parte do tutorial. De o nome de get_file_name.<br \/>\n2.\u00a0\u00a0\u00a0 Arraste os Steps abaixo para a \u00e1rea de trabalho, d\u00ea nomes a eles, e crie os Hops para conect\u00e1-los de acordo com a imagem:<\/address>\n<address><img decoding=\"async\" src=\"http:\/\/www.ademargomes.com\/images\/stories\/imagem9.jpg\" alt=\"\" border=\"0\" \/><\/address>\n<ul>\n<li>\n<address>Get System Info (categoria Input)<\/address>\n<\/li>\n<li>\n<address>Filter Rows (categoria Flow)<\/address>\n<\/li>\n<li>\n<address>Abort (categoria Flow)<\/address>\n<\/li>\n<li>\n<address>Set Variable (categoria Job)<\/address>\n<\/li>\n<\/ul>\n<address>3.\u00a0\u00a0\u00a0 Configure os steps como segue abaixo:<br \/>\n<strong>Configurando o Step Get System Info<\/strong><br \/>\nEsse Step captura informa\u00e7\u00f5es das fontes fora da transforma\u00e7\u00e3o, como por exemplo a data do sistema ou par\u00e2metros digitados em linha de comando. Nesse caso ser\u00e1 utilizado para pegar o par\u00e2metro necess\u00e1rio para completar as tarefas dessa parte do tutorial. Na janela de configura\u00e7\u00e3o desse Step existe um grid onde cada linha digitada se torna uma nova coluna contendo informa\u00e7\u00f5es do sistema.<br \/>\n1.\u00a0\u00a0\u00a0 Clique duas vezes no Step.<br \/>\n2.\u00a0\u00a0\u00a0 Na primeira c\u00e9lula, abaixo a coluna Name, digite my_file.<br \/>\n3.\u00a0\u00a0\u00a0 Quando clicar abaixo da coluna Type, uma janela ser\u00e1 exibida com as op\u00e7\u00f5es dispon\u00edveis. Selecione command line argument 1.<br \/>\n4.\u00a0\u00a0\u00a0 Clique em OK<\/address>\n<address><strong>Configurando o Step Filter Rows<\/strong><br \/>\nO Step Filter Rows divide sua sa\u00edda em duas, escolhendo qual sa\u00edda ser\u00e1 utilizada baseado em condi\u00e7\u00f5es. As linhas que atendem a condi\u00e7\u00e3o seguem um caminho no Job. As demais seguem outro caminho.<br \/>\n1.\u00a0\u00a0\u00a0 Clique duas vezes no step<br \/>\n2.\u00a0\u00a0\u00a0 Escreva a condi\u00e7\u00e3o: Em Field selecione my_file e substitua\u00a0 o sinal \u201c=\u201d por IS NULL.<br \/>\n3.\u00a0\u00a0\u00a0 Na lista perto da op\u00e7\u00e3o Send &#8216;true&#8217; data to Step, selecione Abort.<br \/>\n4.\u00a0\u00a0\u00a0 Na lista perto de Send &#8216;false&#8217; data to Step, selecione Set Variable.<br \/>\n5.\u00a0\u00a0\u00a0 Clique OK.<br \/>\nAgora, um par\u00e2metro nulo (NULL) ser\u00e1 encaminhado para o Step Abort e um par\u00e2metro n\u00e3o nulo (NOT NULL) ser\u00e1 encaminhado para o Set Variable.<\/address>\n<address><strong>Configurando o Step Abort<\/strong><br \/>\nN\u00e3o existe nada para configurar nesse Step. Se alguma linha chegar a esse Step, a transforma\u00e7\u00e3o \u00e9 encerrada imediatamente, e um retorno de falha \u00e9 enviado para o Job onde ser\u00e1 utilizado.<\/address>\n<address><strong>Configurando o Step Set Variable<\/strong><br \/>\nEsse Step permite que se crie vari\u00e1veis e que se coloque os valores dos campos de sa\u00edda nelas. A janela de configura\u00e7\u00e3o ser\u00e1 exibida. Cada linha do grid pode conter uma vari\u00e1vel.<br \/>\n1.\u00a0\u00a0\u00a0 Clique duas vezes no step<br \/>\n2.\u00a0\u00a0\u00a0 Coloque em\u00a0 Get Fields. O \u00fanico campo que ser\u00e1 mostrado: my_file. O valor padr\u00e3o da vari\u00e1vel \u00e9 o nome do campo em mai\u00fasculas. O nome ficar\u00e1 MY_FILE. Deixe o nome assim.<br \/>\n3.\u00a0\u00a0\u00a0 Clique OK.<\/address>\n<p>&nbsp;<\/p>\n<address>Execu\u00e7\u00e3o<\/address>\n<address>1.\u00a0\u00a0\u00a0 Para testar a transforma\u00e7\u00e3o, clique em Run.<br \/>\n2.\u00a0\u00a0\u00a0 A janela de par\u00e2metros ser\u00e1 exibida. Voc\u00ea deve usar esse grid para entrar com o par\u00e2metro que poderia ser escrito na linha de comando. Na primeira linha da coluna Value digite list.<br \/>\n3.\u00a0\u00a0\u00a0 Clique Launch<br \/>\n4.\u00a0\u00a0\u00a0 No log voc\u00ea ver\u00e1 uma mensagem como essa:<\/address>\n<p>&nbsp;<\/p>\n<address>Set Variables.0 &#8211; Set variable MY_FILE to value [list]<\/address>\n<address>5.\u00a0\u00a0\u00a0 Clique em Run novamente mas n\u00e3o digite nenhum par\u00e2metro. Dessa vez voc\u00ea ver\u00e1 a mensagem:<\/address>\n<p>&nbsp;<\/p>\n<address>Abort.0 &#8211; Row nr 1 causing abort : []<\/address>\n<address>Abort.0 &#8211; Aborting after having seen 1 rows.<\/address>\n<address>Perto do topo da janela ser\u00e1 poss\u00edvel ver a mensagem de erro do Step abortado que indica que um erro ocorreu e que a transforma\u00e7\u00e3o falhou, como esperado.<\/address>\n<p>&nbsp;<\/p>\n<address>Modificando a Transforma\u00e7\u00e3o<\/address>\n<address>Agora \u00e9 hora de modificar a Transforma\u00e7\u00e3o Hello para que comparar nomes de arquivos com seus respectivos par\u00e2metros. Se um par\u00e2metro fosse foo, a transforma\u00e7\u00e3o leria o arquivo foo.csv e criaria um arquivo foo_with_greetings.xml. Isso ajudaria tamb\u00e9m a descartar as linhas em branco dentro do arquivo.<br \/>\n1.\u00a0\u00a0\u00a0 Abra a transforma\u00e7\u00e3o Hello.ktr.<br \/>\n2.\u00a0\u00a0\u00a0 Abra a janela de configura\u00e7\u00e3o do Step CSV File Input.<br \/>\n3.\u00a0\u00a0\u00a0 Apague o conte\u00fado da caixa de texto Filename e pressione Ctrl-Spacebar para ver a lista das vari\u00e1veis existentes. Voc\u00ea deveria ver a vari\u00e1vel FILES que foi adicionada\u00a0 no arquivo kettle.properties. Selecione isso e adicione o nome da vari\u00e1vel que foi criada na transforma\u00e7\u00e3o que acabou de ser criada. Digite na caixa de texto:<\/address>\n<p>&nbsp;<\/p>\n<address>${FILES}\/${MY_FILE}.csv<\/address>\n<address>4.\u00a0\u00a0\u00a0 Clique em OK.<br \/>\n5.\u00a0\u00a0\u00a0 Abra a janela de configura\u00e7\u00e3o do Step XML Output.<br \/>\n6.\u00a0\u00a0\u00a0 Substitua o conte\u00fado da caixa de texto Filename por:<\/address>\n<p>&nbsp;<\/p>\n<address>${FILES}\/${MY_FILE}_with_greetings.xml<\/address>\n<address>7.\u00a0\u00a0\u00a0 Clique OK.<br \/>\n8.\u00a0\u00a0\u00a0 Arraste o Step Filter Rows para \u00e1rea de trabalho e arraste-o novamente para\u00a0 em cima de do Hop que sa\u00ed do CSV Input (quando o Hop se tornar mais largo, solte Step). Isso conecta o novo Step na seq\u00fc\u00eancia de Steps existentes.<br \/>\n9.\u00a0\u00a0\u00a0 Selecione\u00a0 name para o campo, e IS NOT NULL como comparador.<br \/>\n10.\u00a0\u00a0\u00a0 Deixe a op\u00e7\u00e3o Send &#8216;true&#8217; data to Step e Send &#8216;false&#8217; data to Step em branco. Isso faz com que apenas as linhas que atende a condi\u00e7\u00e3o (as que contenham nome) passam para o pr\u00f3ximo Step.<br \/>\n11.\u00a0\u00a0\u00a0 \u00a0Clique em OK.<br \/>\n12.\u00a0\u00a0\u00a0 Clique em Save As e d\u00ea o nome de Hello_with_parameters para a transforma\u00e7\u00e3o.<\/address>\n<address>Executando a transforma\u00e7\u00e3o<\/address>\n<address>Para testar as mudan\u00e7as feitas voc\u00ea dever ter certeza que a vari\u00e1vel MY_FILE existe e que a mesma contenha valor. Como essa transforma\u00e7\u00e3o \u00e9 independente da que cria a vari\u00e1vel, ser\u00e1 necess\u00e1rio cri\u00e1-la manualmente.<br \/>\n1.\u00a0\u00a0\u00a0 No menu Edit, selecione Set Environment Variables. Uma lista de vari\u00e1veis aparecer\u00e1.<br \/>\n2.\u00a0\u00a0\u00a0 No final da lista, digite MY_FILE como nome da vari\u00e1vel. Como conte\u00fado, digite o nome do arquivo sem extens\u00e3o.<br \/>\n3.\u00a0\u00a0\u00a0 Clique em OK.<br \/>\n4.\u00a0\u00a0\u00a0 Clique em Run.<br \/>\n5.\u00a0\u00a0\u00a0 Na lista de vari\u00e1veis voc\u00ea ver\u00e1 a que foi criada. Clique em Launch para executar a transforma\u00e7\u00e3o.<br \/>\n6.\u00a0\u00a0\u00a0 Por ultimo verifique a exist\u00eancia e conte\u00fado do arquivo de sa\u00edda.<\/address>\n<address>Criado o Job principal<\/address>\n<address>A \u00faltima tarefa nessa parte do tutorial \u00e9 a constru\u00e7\u00e3o do Job principal:<\/address>\n<address><strong>Criando o Job:\u00a0<\/strong><br \/>\n1.\u00a0\u00a0\u00a0 Clique em New e depois em Job.<br \/>\n2.\u00a0\u00a0\u00a0 A \u00e1rea de trabalho de Job ser\u00e1 exibida.<br \/>\n3.\u00a0\u00a0\u00a0 Clique em Job e em Configuration.<br \/>\n4.\u00a0\u00a0\u00a0 Digite um nome e uma descri\u00e7\u00e3o.<br \/>\n5.\u00a0\u00a0\u00a0 Clique em Save. Salve o Job na pasta Tutorial com o nome de Hello.<br \/>\n<strong>Crie o esqueleto do Job com componentes e Hops:<\/strong><br \/>\nA esquerda da \u00e1rea de trabalho existe a paleta de componentes Job Entries. Diferente da paleta de transforma\u00e7\u00e3o, essa n\u00e3o agrupa os itens em categorias.<br \/>\n1.\u00a0\u00a0\u00a0 Arraste um componente\u00a0 Start, dois Transformation e um File Exists na \u00e1rea de trabalho de nomes e conecte-os atrav\u00e9s de Hops.<br \/>\n2.\u00a0\u00a0\u00a0 Arraste dois Abort Jobs para a \u00e1rea de trabalho, d\u00ea nome e conecte-os. Nesse ponto os Hops ficaram vermelhos.<br \/>\n<strong>Configurando os Steps:\u00a0<\/strong><br \/>\n1.\u00a0\u00a0\u00a0 Clique duas vezes o componente da primeira transforma\u00e7\u00e3o.<br \/>\n2.\u00a0\u00a0\u00a0 No campo Transformation filename, digite get_file_name.ktr.<br \/>\n3.\u00a0\u00a0\u00a0 Por conta das transforma\u00e7\u00f5es estarem na mesma pasta, voc\u00ea pode usar a vari\u00e1vel de caminho do Job:<\/address>\n<p>&nbsp;<\/p>\n<address>${Internal.Job.Filename.Directory}\/get_file_name.ktr<\/address>\n<address>4.\u00a0\u00a0\u00a0 Clique em OK.<br \/>\n<strong>Configurando o Segundo componente Transformation.<\/strong><\/address>\n<address>1.\u00a0\u00a0\u00a0 Clique duas vezes no componente.<br \/>\n2.\u00a0\u00a0\u00a0 Digite o nome da outras Transforma\u00e7\u00e3o no campo Transformation Filename e clique em OK:<\/address>\n<p>&nbsp;<\/p>\n<address>${Internal.Job.Filename.Directory}\/Hello_with_parameter.ktr<\/address>\n<address><strong>Configurando o component File Exists<\/strong><br \/>\n1.\u00a0\u00a0\u00a0 Clique duas vezes no componente.<br \/>\n2.\u00a0\u00a0\u00a0 No campo Filename , coloque o caminho completo do arquivo que voc\u00ea quer verificar se existe. O nome \u00e9 o mesmo que voc\u00ea escreveu na transforma\u00e7\u00e3o Hello ap\u00f3s a modifica\u00e7\u00e3o:<\/address>\n<address>${FILES}\/${MY_FILE}.csv<\/address>\n<address>Nota: Lembre-se que a vari\u00e1vel ${FILES} foi definida no arquivo kettle.properties e a vari\u00e1vel ${MY_FILE} foi criada no componente que ser\u00e1 executado antes desse.<br \/>\n<strong>Configurando o primeiro componente Abort Job Job:\u00a0<\/strong><br \/>\n1.\u00a0\u00a0\u00a0 Na caixa de texto Message digite: O arquivo n\u00e3o existe<\/address>\n<address><strong>Configurando o segundo componente Abort Job Job:\u00a0<\/strong><br \/>\n1.\u00a0\u00a0\u00a0 Na caixa de texto Message digite:<\/address>\n<address>O arquivo ${FILES}\/${MY_FILE}.csv n\u00e3o existe<br \/>\nNota: Durante a execu\u00e7\u00e3o, a ferramenta substitui o nome da vari\u00e1vel por seu conte\u00fado. Por exemplo: &#8220;O arquivo c:\/Pentaho\/Files\/list.csv n\u00e3o existe.<\/address>\n<p>&nbsp;<\/p>\n<address><strong>Configurando Hops<\/strong><\/address>\n<address>Um componente Job Entry pode ser executado sem condi\u00e7\u00e3o mesmo quando o componente anterior \u00e9 executado sem sucesso. Esse tipo de execu\u00e7\u00e3o \u00e9 representado por diferente cores nos Hops: Um Hop preto indica que o pr\u00f3ximo componente \u00e9 sempre executado. Um Hop verde indica que o pr\u00f3ximo componente \u00e9 executado apenas se o anterior for executado com sucesso. E um Hop vermelho indica que o pr\u00f3ximo componente ser\u00e1 executado\u00a0 se o anterior falhar a sua execu\u00e7\u00e3o.<br \/>\nComo conseq\u00fc\u00eancia da ordem em que os componentes foram criados e ligados uns aos outros, todos os Hops ficam com a cor preta. O passos ser\u00e3o executados da seguinte forma:<\/address>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<address>A primeira transforma\u00e7\u00e3o vai ser executada sempre. (O Hop que vai do Start at\u00e9 esse componente \u00e9 preto)<\/address>\n<\/li>\n<li>\n<address>Se a transforma\u00e7\u00e3o falhar (Caso n\u00e3o exista um par\u00e2metro) o Hop vermelho encaminha do Job para o componente Abort Job.<\/address>\n<\/li>\n<li>\n<address>Se a transforma\u00e7\u00e3o for executada com sucesso, o Job \u00e9 encaminhado para o Hop verde para a verifica\u00e7\u00e3o da exist\u00eancia do arquivo. Se essa falhar, ser\u00e1 encaminhada para o componente Abort Job atrav\u00e9s do Hop vermelho, se essa verifica\u00e7\u00e3o for executada com sucesso, o Job ser\u00e1 encaminhado atrav\u00e9s o Hop verde para a transforma\u00e7\u00e3o principal.<\/address>\n<\/li>\n<\/ul>\n<address>Como isso funciona<\/address>\n<address>Quando o Job \u00e9 executado, o Kettle segue a ordem dos componentes conectados atrav\u00e9s de Hops.A execu\u00e7\u00e3o se a seq\u00fc\u00eancia montada. Cada componente \u00e9 executado por vez fazendo com que os demais componentes do tipo Job Entry aguardem a execu\u00e7\u00e3o do componente anterior.<br \/>\nNa vida real, um Job pode resolver problemas relacionados a seq\u00fc\u00eancia de transforma\u00e7\u00f5es. Se voc\u00ea precisa que uma transforma\u00e7\u00e3o aguarde at\u00e9 que outra termine, voc\u00ea deve usar Jobs para isso.<\/address>\n<address>Executando o Job<\/address>\n<address>Para executar um Job primeiro deve ser informado o par\u00e2metro. O \u00fanico lugar que usa o par\u00e2metro \u00e9 na transforma\u00e7\u00e3o get_file_name, por isso passe os par\u00e2metros da seguinte forma:<br \/>\n1.\u00a0\u00a0\u00a0 Clique duas vezes no componente de transforma\u00e7\u00e3o (get_file_name)<br \/>\n2.\u00a0\u00a0\u00a0 Nessa janela aparecer\u00e1 o grid Fields.\u00a0 Na primeira linha escreva o nome do arquivo criado na pasta Tutorial sem extens\u00e3o.<br \/>\n3.\u00a0\u00a0\u00a0 Clique em OK.<br \/>\n4.\u00a0\u00a0\u00a0 Clique em Run.<br \/>\n5.\u00a0\u00a0\u00a0 Uma janela ser\u00e1 mostrada com informa\u00e7\u00f5es gerais relacionadas com a execu\u00e7\u00e3o do Job.<br \/>\n6.\u00a0\u00a0\u00a0 Clique em Execute.<br \/>\n7.\u00a0\u00a0\u00a0 O painel de log ser\u00e1 mostrado.<br \/>\nO arquivo ter\u00e1 sido criado se ao final do log voc\u00ea ver:<\/address>\n<p>&nbsp;<\/p>\n<address>Spoon &#8211; Job has ended.<\/address>\n<address>Se o arquivo de entrada foi o list.csv ent\u00e3o o arquivo de sa\u00edda deveria ser list_with_greetings.xml e deveria estar na mesma pasta. Ache o arquivo e verifique o conte\u00fado.<br \/>\nEm caso de o par\u00e2metro ser preenchido com o nome de um arquivo inexistente, o Job falhar\u00e1 e voc\u00ea ver\u00e1:<\/address>\n<p>&nbsp;<\/p>\n<address>Abort &#8211; The file &lt;parameter&gt; does not exist<\/address>\n<address>E se por acaso o par\u00e2metro for esquecido a mensagem deveria ser:<\/address>\n<p>&nbsp;<\/p>\n<address>Abort &#8211; The file name is missing<\/address>\n<p>&nbsp;<\/p>\n<address><strong>Kitchen<\/strong><\/address>\n<address>O Kitchen \u00e9 a ferramenta usada para executar Jobs a partir de janelas de terminais. O arquivo de script \u00e9 o kitchen.bat no Windows e kitchen.sh em outras plataformas. Esses arquivos s\u00e3o encontrados na pasta de instala\u00e7\u00e3o. Executando o script sem nenhuma op\u00e7\u00e3o, o mesmo exibe uma lista das poss\u00edveis op\u00e7\u00f5es.<br \/>\nPara executar um Job, use o seguinte comando:<\/address>\n<p>&nbsp;<\/p>\n<address>kitchen \/file &lt;Jobs_path&gt;\/Hello.kjb &lt;par&gt; \/norep<\/address>\n<address><strong>\/norep<\/strong>\u00a0&#8211; comando que diz ao Kettle para n\u00e3o conectar em reposit\u00f3rio.<br \/>\n<strong>\/file<\/strong>\u00a0\u2013 deve preceder o nome do arquivo de Job (.kjb).<br \/>\n<strong>&lt;Jobs_path&gt;<\/strong>\u00a0\u2013 caminho completo de onde se encontra o arquivo. Por exemplo:<br \/>\nc:\/Pentaho\/Tutorial (Windows)<br \/>\nou<br \/>\n\/home\/PentahoUser\/Tutorial<br \/>\n<strong>&lt;par&gt;<\/strong>\u00a0&#8211; par\u00e2metro que a transforma\u00e7\u00e3o esta esperando. Lembre-se que o par\u00e2metro esperado \u00e9 o nome do arquivo de entrada sem o .csv no final.<\/address>\n<address>Depois desse comando o Job ser\u00e1 executado da mesma forma que seria no Spoon. Nesse caso o log ser\u00e1 escrito no terminal a menos que seja direcionada para um arquivo. Assim como na transforma\u00e7\u00e3o, o formato da informa\u00e7\u00e3o mostrada \u00e9 diferente mas o conte\u00fado b\u00e1sico \u00e9 o mesmo.<br \/>\nTente executar o Job sem par\u00e2metro ou com um par\u00e2metro invalido para ver se est\u00e1 funcionando de acordo com o esperado. Tamb\u00e9m experimente o uso do Kitchen, tente usar diferente n\u00edveis de log e outras op\u00e7\u00f5es dispon\u00edveis.<\/address>\n<address>\u00a0<\/address>\n<address>Fonte:\u00a0<a href=\"http:\/\/www.ademargomes.com\/index.php\/artigos\/56-turialkettle.html?showall=1\">http:\/\/www.ademargomes.com\/index.php\/artigos\/56-turialkettle.html?showall=1<\/a><\/address>\n","protected":false},"excerpt":{"rendered":"<p>Pentaho Data Integration (PDI, tamb\u00e9m chamado Kettle) \u00e9 um componente da su\u00edte do Pentaho respons\u00e1vel pelos processos de Extra\u00e7\u00e3o, Transforma\u00e7\u00e3o e Carga (ETL). Apesar de ferramentas de ETL serem usadas em projetos de data warehouse, PDI pode tamb\u00e9m ser usado para: * Migra\u00e7\u00e3o de dados entre aplica\u00e7\u00f5es\/banco de dados * Exportar dados de banco de &hellip; <a href=\"https:\/\/leonardocotta.com.br\/?p=1033\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Tutorial Kettle &#8211; Pentaho Data Integration<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[49],"tags":[75,161,170,202,266],"class_list":["post-1033","post","type-post","status-publish","format-standard","hentry","category-pentaho-data-integration","tag-bi","tag-job","tag-kettle","tag-pdi","tag-transformacao"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts\/1033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1033"}],"version-history":[{"count":0,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts\/1033\/revisions"}],"wp:attachment":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}