Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Manual de Treinamento de Introdução
ao ECL (Parte 2) - ETL com ECL
Equipe de Treinamento HPCC
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Equipe de Treinamento HPCC
Copyright © 2020 HPCC Systems. All rights reserved
Sua opinião e comentários sobre este documento são muito bem-vindos e podem ser enviados por e-mail para <docfeedback@hpccsystem-
s.com> Inclua Feedback sobre a documentação no título do email e faça referência ao nome do documento, número de página e número da
versão atual no texto da mensagem.
LexisNexis e o logotipo Knowledge Burst são marcas comerciais registradas da Reed Elsevier Properties Inc., usadas sob licença. Os demais
produtos, logotipos e serviços podem ser marcas comerciais ou registradas de suas respectivas empresas. Todos os nomes e dados de exemplo
usados neste manual são fictícios. Qualquer semelhança com pessoas reais, vivas ou mortas, é mera coincidência.
1 de fevereiro de 2020 Versão 7.6.0
© 2020 HPCC Systems. All rights reserved
2
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Visão Geral ........................................................................................................................................ 5
Introdução .................................................................................................................................. 5
Convenções de Documentação ...................................................................................................... 9
Definir e organizar seus dados ............................................................................................................. 10
Exercício 1: Organize suas definições de dados .............................................................................. 10
Relatórios de tabulação ....................................................................................................................... 12
TABLE .................................................................................................................................... 13
Relatórios Cross-Tab ................................................................................................................ 15
Exemplo de tabulação funcional ................................................................................................... 18
Exercício 2a ............................................................................................................................. 19
Exercício 2b ............................................................................................................................. 19
Mais relatórios de avaliação de dados ................................................................................................... 21
DISTRIBUTE "Randômico" ........................................................................................................ 22
HASH32 .................................................................................................................................. 25
Exercício 3a ............................................................................................................................. 26
Exercício 3b ............................................................................................................................. 27
Padrões dos Dados .................................................................................................................... 28
Visualização ............................................................................................................................. 32
Exercício 3c ............................................................................................................................. 37
Exercício 3d ............................................................................................................................. 38
Transformações simples ...................................................................................................................... 39
Estrutura TRANSFORM ............................................................................................................. 39
PROJECT ................................................................................................................................ 42
Exemplo funcional de PROJECT ................................................................................................. 46
ITERATE ................................................................................................................................. 48
Exemplo funcional ITERATE ...................................................................................................... 50
PERSIST .................................................................................................................................. 52
Estrutura SERVICE ................................................................................................................... 53
Node ....................................................................................................................................... 55
Nodes ...................................................................................................................................... 56
Exercício 4a ............................................................................................................................. 57
Exercício 4b ............................................................................................................................. 58
Padronização de dados ....................................................................................................................... 59
SIZEOF ................................................................................................................................... 60
Exercício 5a ............................................................................................................................. 62
Exercício 5b ............................................................................................................................. 63
Criando tabelas lookup ....................................................................................................................... 64
ROLLUP .................................................................................................................................. 65
Exemplo de ROLLUP funcional .................................................................................................. 69
Exercício 6a ............................................................................................................................. 71
Exercício 6b ............................................................................................................................. 71
Juntando arquivos .............................................................................................................................. 72
JOIN ....................................................................................................................................... 73
Exemplo de JOIN funcional ........................................................................................................ 82
INTFORMAT ........................................................................................................................... 85
Exercício 7a ............................................................................................................................. 86
Exercício 7b ............................................................................................................................. 87
Exercício 7c ............................................................................................................................. 88
Soluções para exercícios de laboratório .................................................................................................89
Exercício 1 ............................................................................................................................... 89
Exercício 1 (continuação) ........................................................................................................... 90
Exercício 2a ............................................................................................................................. 91
Exercício 2b ............................................................................................................................. 91
Exercício 3a ............................................................................................................................. 92
© 2020 HPCC Systems. All rights reserved
3
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Exercício 3b ............................................................................................................................. 92
Exercício 3c ............................................................................................................................. 92
Exercício 3d ............................................................................................................................. 93
Exercício 4a ............................................................................................................................. 94
Exercício 4b ............................................................................................................................. 95
Exercício 5a ............................................................................................................................. 96
Exercício 5b ............................................................................................................................. 97
Exercício 6a ............................................................................................................................. 98
Exercício 6b ............................................................................................................................. 99
Exercício 7a ............................................................................................................................ 100
Exercício 7a (continuação) ........................................................................................................ 101
Exercício 7b ............................................................................................................................ 102
Exercício 7c ............................................................................................................................ 103
© 2020 HPCC Systems. All rights reserved
4
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Visão Geral
Visão Geral
Introdução
Bem-vindo ao curso de Introdução ao ECL (parte 2) - o processo de Extração, Transformação e Carregamento (ETL).
Este curso contém um conjunto de exercícios práticos, usando os recursos avançados de manipulação de dados da
ECL e do HPCC Systems (High Performance Computing Cluster) da LexisNexis, com foco específico na Refinaria
de Dados (THOR).
Esses exercícios são agrupados por áreas de tópicos avançados, focadas em funções ou recursos específicos da lin-
guagem ECL. Uma revisão e discussão aprofundadas das funções ECL utilizadas precederão cada conjunto de exer-
cícios.
O que é THOR?
Thor (o Cluster de Refinaria de Dados) é a parte do HPCC Systems responsável por consumir grandes quantidades
de dados, transformar, vincular e indexá-los. Ele funciona como um sistema de arquivos distribuído com poder de
processamento paralelo espalhado por vários nós. Um cluster pode escalar de um único nó para milhares de nós. O
termo THOR refere-se ao mítico deus nórdico do trovão, com o grande martelo usado como simbolo para esmagar
grandes quantidades de dados brutos em informações úteis. Esse processo de "martelar os dados" é mais conhecido
como Processo de Extração, Transformação e Carregamento ou ETL (Extract, Transform and Load).
Visão Geral do Processo ETL
Nesse momento, você deve saber que a ECL (Enterprise Control Language) é uma linguagem centrada em dados pro-
jetada e usada apenas com o HPCC Systems (High Performance Computer Cluster). Ele foi projetado especificamente
para gerenciamento de dados e processamento de consultas. A linguagem é declarativa; você define quais dados pre-
cisa por meio de uma variedade de definições e cria as ações de ECL executadas sobre elas.
Tudo começa com sua fonte de dados, que é movida e armazenada no HPCC por meio da Refinaria de Dados THOR.
Arquivos de dados e índices adicionais são produzidos e manipulados no processo ETL. Esse processo de ETL pode
variar com base no conteúdo e tipo de construção necessário, e no número e tipos de fontes.
A extração envolve a importação e a limpeza de dados brutos de várias fontes.
O principal objetivo da fase de extração é converter os dados em formatos utilizáveis, adequados ao processamento de
transformação de dados no HPCC. Outra parte da fase de extração envolve a análise dos dados extraídos para verificar
se os dados atendem a um padrão ou estrutura esperado. Caso contrário, parte ou todos os dados podem ser rejeitados.
A transformação envolve a combinação e a coleta de informações de várias fontes.
• Mapeamento de campos de origem para layouts de registros comuns usados nos dados.
• Divisão ou combinação de arquivos, registros ou campos de origem para corresponder ao layout necessário.
• Padronização e limpeza de campos de pesquisa vitais, como nomes, endereços, datas, etc.
• Avaliação dos prazos atuais e históricos de informações vitais para identificação cronológica e localização dos su-
jeitos.
© 2020 HPCC Systems. All rights reserved
5
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Visão Geral
• Análise estatística e outras análises diretas dos dados para determinar e manter a qualidade à medida que novas fontes
e atualizações são incluídas.
O processo de transformação geralmente requer várias etapas, incluindo, entre outras:
1. Mapear e converter dados do campo de origem em layouts de registros comuns, dependendo de sua finalidade.
Alguns exemplos incluem:
• Combinar vários registros em um único (desnormalizar) ou dividir registros únicos em vários registros filho rela-
cionados (normalizar).
• Traduzir códigos em descrições e/ou vice-versa.
• Divisão de nomes conjuntivos.
• Reformatação e validação de campos de data.
• Identificar e anexar IDs internos a pessoas, empresas e outras entidades, para vinculá-los entre datasets.
2. Aplique regras de duplicação e combinação a cada dataset de origem e aos datasets de construção comuns, conforme
necessário:
• Dependendo do tipo de fonte, os datasets são processados. Todos os novos registros serão simplesmente adicionados,
os registros existentes podem precisar ser atualizados ou os registros existentes podem ter que ser substituídos.
• As duplicatas podem ter que ser identificadas e excluídas ou combinadas com os dados existentes, possivelmente
expandindo o período válido dos dados.
• Vincular registros entre si, se aplicável, fornecendo linhas de tempo de atividade ou status.
Carregamento envolve a produção de índices para entrega de dados ao cliente (ou usuário final).
O processo de carregamento envolve a construção de índices e a implantação de dados e consultas em um cluster
ROXIE.
• Criar um índice é principalmente uma operação de classificação, e é por isso que o THOR é usado para esse processo.
• Os índices criados no THOR são geralmente usados em um cluster ROXIE para atender a consultas interativas e para
acessar rapidamente um registro específico necessário para uma consulta individual.
• Os índices criados no THOR também podem ser usados no THOR/ECL Agent.
OBSERVAÇÃO: Nesta aula, focaremos inteiramente as fases de Extração e Transformação do ETL. O processo de
carregamento é abordado nos cursos Roxie básico e avançado, mais adiante nestasérie.
ECL em ETL - 4 Objetivos Principais
Ao iniciar qualquer processo ETL, há quatro (4) objetivos principais pelos quais você deve sempre se esforçar.
1. Entenda (conheça) seus dados.
Comece a conhecer seus dados, definindo-os primeiro após o spraying. Em seguida, use os relatórios de tabulação
cruzada ("agrupados por" TABLE) para obter contagens de população de campos, determinar a cardinalidade (exclu-
sividade) dos valores dos campos-chave (a função COUNT por valor exclusivo) para descobrir possíveis desvios,
© 2020 HPCC Systems. All rights reserved
6
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Visão Geral
obtenha valores numéricos MAX e MIN para identificar valores reais, intervalos de valores de campo e valores fora
do esperado, além de outros problemas possíveis com os dados. Use essas informações para desenvolver estratégias
para distribuição uniforme em todos os nós, compactação de dados e arquitetura.
2. Opere apenas com os dados necessários.
As seguintes técnicas garantirão esse segundo objetivo:
• Atribua IDs de registro exclusivos a todos os dados de entrada
Use PROJECT (dataset, COUNTER) ou a posição inicial do arquivo (FILEPOS) para criá-los.
• Limpe e padronize os dados conforme apropriado
Elementos comuns de padronização são nomes, endereços, datas, horas etc.
• Use projeções verticais (“vertical slice” TABLE)
Essa técnica permite trabalhar apenas com os campos que você realmente precisa.
• Use projeções horizontais (filtros de registro)
Essa técnica permite selecionar apenas os registros relevantes para o problema. A filtragem também permite excluir
registros com valores NULL nos campos-chave e filtrar dados inválidos ou irrelevantes, a menos que possam ser
limpos.
3. Transforme dados no menor formato de armazenamento
• Em relação à representação numérica, o tipo UNSIGNED é o melhor. Use INTEGER apenas se forem necessários
valores com sinais e, para todos os números, selecione o menor tamanho apropriado para o intervalo de valores.
• Os valores de hash são uma ótima técnica para testar a unicidade de valores. O COUNT do DEDUP dos campos
com hash deve ser igual ao COUNT dos valores de hash e sempre use um tamanho de hash apropriado: 32-bit (HASH,
HASH32), 64-bit (HASH64), e 128-bit (HASHMD5).
• Use tabelas de Lookup sempre que possível. Os valores "padrão" de STRING´s podem ser reduzidos para números
inteiros representativos e recuperados na saída.
4. Use estratégias que otimizam seu processo ETL
• Use o ECL Watch como um Profiler de execução para verificar as contagens de registros e a distribuição/viés de
uma etapa para outra. Você também pode usá-lo para verificar o tempo dos subgrafos para identificar os "pontos de
acesso" onde a eficiência da execução pode potencialmente ser melhorada.
• Mantenha seus dados desduplicados durante todo o processo, especialmente após JOINs. Isso minimiza qualquer
efeito de crescimento descontrolado de etapa para etapa que aumentará o tempo de processamento e poderá causar
distribuição desigual. Use DEDUP, ALL [um hash dedup] ou SORT e DEDUP.
• Mantenha suas distribuições entre nós, mesmo durante todo o processo. Se algum viés se desenvolver em uma etapa
por causa da natureza dos dados, use DISTRIBUTE novamente para garantir a eficiência nas etapas subsequentes.
• Use GROUP sempre que possível. Sequências complexas de operações (SORT, DEDUP, ITERATE, ROLLUP etc.)
são mais eficientes quando todos os dados estão na memória. Use a opção GROUP ALL ou SORT nos dados antes
do agrupamento.
© 2020 HPCC Systems. All rights reserved
7
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Visão Geral
• Use operações do tipo LOCAL na maioria das vezes. LOCAL pode ser usado na maioria das operações, incluindo
GROUP e TABLE
• Use a opção LOOKUP ou ALL sempre que possível. As opções LOOKUP e ALL em um JOIN carregam todos os
registros do arquivo de pesquisa em cada nó, portanto, é implicitamente uma operação LOCAL
• Aplique PERSIST em etapas intermediárias/conjuntos de registros. Isso facilitará a depuração de um novo processo e
minimizará o tempo de reexecução à medida que partes de um processo forem desenvolvidas, além de fornecer alguma
capacidade de recuperação de falhas no sistema
• Use OUTPUT(,NAMED) para os principais valores intermediários. Esses valores são armazenados na unidade de
trabalho e podem ser analisados para identificar possíveis problemas.
© 2020 HPCC Systems. All rights reserved
8
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Visão Geral
Convenções de Documentação
Linguagem ECL
Embora o ECL não faça distinção entre maiúsculas e minúsculas, as palavras-chave reservadas do ECL e as funções
built-in deste documento são sempre exibidas com todos os caracteres EM CAIXA ALTA (ALL CAPS) para dar
destaque e facilitar a identificação.
Nomes
Atributos e nomes de conjunto de registros são sempre exibidos no código de exemplo usando caracteres maiúsculos
e minúsculos. Palavras fundidas podem ser usadas para identificar explicitamente a finalidade nos exemplos.
Código de Exemplo
Todos os códigos de exemplo neste documento aparecem com a seguinte fonte:
 MyDefinitionName := COUNT(People);
 // MyDefinitionName is a user-defined Definition
 // COUNT is a built-in ECL function
 // People is the name of a dataset
Ações
Nas seções do tutorial, haverá ações explícitas a serem executadas. Tudo isso é mostrado com um marcador para
diferenciar as etapas da ação do texto explicativo, conforme mostrado aqui:
• As ações do teclado e mouse são todas mostradas em caixa baixa, tais como: CLIQUE DUAS VEZES ou pressione
a tecla ENTER .
• Os itens na tela a serem selecionados são mostrados em negrito, como: pressione o botão OK para retornar
Trechos da Linguagem ECL
Este manual contém discussões sobre vários recursos específicos da ECL usados nos exercícios. Esta informação foi
extraída do livro Referência a Linguagem ECL. No entanto, nem todas as informações contidas nesse documento foram
colocadas neste. Isso significa que você ainda precisa ler o Referência a Linguagem ECL para obter uma discussão
completa sobre qualquer recurso da ECL.
No caso de qualquer conflito identficado entre este documento e a Referência a Linguagem ECL, agora ou em
qualquer versão futura, a autoridade dominante é a Referência a Linguagem ECL.
© 2020 HPCC Systems. All rights reserved
9
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Definir e organizar seus dados
Definir e organizar seus dados
Exercício 1: Organize suas definições
de dados
Especificação do exercício:
Neste primeiro exercício de laboratório, organizaremos as definições RECORD e DATASET em módulos comuns a
serem usados no restante deste curso. Use o arquivo ECL das definições Persons e Accounts que criamos na aula
Introdução ao ECL como ponto de partida.
Requisitos:
1. Crie um novo arquivo de definição EXPORT chamado File_Persons.
2. Crie um novo arquivo de definição EXPORT chamado File_Accounts.
3. No arquivo de definição File_Persons, crie uma estrutura MODULE para conter as definições de RECORD e
DATASET de Persons (Dica: você pode copiar seu trabalho do arquivo de definição Persons que você criou na classe
Introdução ao ECL).
• Crie as seguintes definições de EXPORTAÇÃO na estrutura do módulo para cada definição Persons, respectiva-
mente:
Layout - para a definição RECORD de Persons
File - para a definição DATASET de Persons
4. No arquivo de definição File_Accounts, crie uma estrutura modular para conter as definições de RECORD e
DATASET Accounts (Dica: você pode copiar seu trabalho do arquivo de definição Accounts que você criou no curso
de Introdução ao ECL).
• Crie as seguintes definições de EXPORTAÇÃO na estrutura módular para cada definição de Accounts, respectiva-
mente:
Layout - para a definição de registros de Accounts
File - para a definição de dataset de Accounts
Comparação do resultado
Teste todas as suas novas definições EXPORTADas em uma nova janela do Buildere verifique se os resultados estão
corretos e razoáveis. Correto e razoável significa que as consultas são executadas sem erros e os dados na janela ECL
IDE Results parecem corretos.
Exemplo:
IMPORT TrainingYourName;
TrainingYourName.File_Persons.File;
TrainingYourName.File_Accounts.File;
© 2020 HPCC Systems. All rights reserved
10
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Definir e organizar seus dados
Isso encerra o Exercício 1!
© 2020 HPCC Systems. All rights reserved
11
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
Relatórios de tabulação
© 2020 HPCC Systems. All rights reserved
12
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
TABLE
TABLE(recordset, format [, expression [,FEW | MANY] [, UNSORTED]] [, LOCAL] [, KEYED ] [, MERGE
] [, SKEW(limit[, target] ) [, THRESHOLD(size) ] ] [, UNORDERED | ORDERED( bool ) ] [, STABLE |
UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
recordset O conjunto para processamento. Pode ser o nome de um dataset ou de um recordset derivado
de algumas condições de filtro, ou qualquer expressão que resulte em um recordset derivado.
format Uma definição de estrutura RECORD que define o tipo, o nome e a fonte de dados para cada
campo.
expression Opcional. Especifica uma cláusula "agrupar por". É possível ter mais de uma expressão separada
por vírgula para criar uma cláusula de "agrupar por" lógica e única. Se a expressão for um campo
do recordset, então há um registro de grupo único na tabela resultante para cada valor distinto
da expressão. Do contrário, a expressão é uma expressão de tipo LEFT/RIGHT no modo de
DEDUP.
FEW Opcional. Indica que a expressão resultará em menos de 10.000 grupos distintos. Isso permite
otimização para gerar um resultado significativamente mais rápido.
MANY Opcional. Indica que a expressão resultará em vários grupos distintos.
UNSORTED Opcional. Especifica que você não se importa com a ordem dos grupos. Isso permite otimização
para gerar um resultado significativamente mais rápido.
LOCAL Opcional. Especifica que a operação é realizada em cada nó de supercomputador de forma in-
dependente, sem exigir interação com todos os outros nós para obter dados; a operação mantém
a distribuição de qualquer operação DISTRIBUTE anterior.
KEYED Opcional. Especifica que a atividade faz parte de uma operação de leitura de índice, a qual
permite que o otimizador gere o código ideal para a operação.
MERGE Opcional. Especifica que os resultados são agregados em cada nó e depois os intermediários
agregados são novamente agregados globalmente. Esse é um método seguro de agregação que
se destaca especialmente bem se os dados adjacentes tiverem sido distorcidos. Se souber que o
número de grupos será baixo, então FEW será ainda mais rápido, evitando a classificação local
dos dados subjacentes.
SKEW Indica que você sabe que os dados não serão espalhados uniformemente entre os nós (serão
distorcidos e você opta por substituir o padrão especificando seu próprio valor limite para per-
mitir que a tarefa continue, apesar da distorção).
limit Um valor entre zero (0) e um (1,0 = 100%) indicando a porcentagem máxima de distorção a ser
permitida antes que a tarefa falhe (a distorção padrão é 1,0 / <número de escravos no cluster>).
target Opcional. Um valor entre zero (0) e um (1,0 = 100%) indicando a porcentagem máxima de
distorção desejada a ser permitida (a distorção padrão é 1,0 / <número de escravos no cluster>).
THRESHOLD Indica o tamanho mínimo de uma única parte antes que o limite SKEW seja aplicado.
size Um valor inteiro indicando o número mínimo de bytes para uma parte única. O padrão é 1.
UNORDERED Opcional. Especifica que a ordem do registro de resultado não é importante.
ORDERED Especifica a importância da ordem do registro de resultado.
bool Quando for “False” (Falso), especifica que a ordem do registro de resultado não é importante.
Quando for “True’ (Verdadeiro), especifica a ordem padrão do registro de resultado.
STABLE Opcional. Especifica que a ordem do registro de entrada é importante.
UNSTABLE Opcional. Especifica que a ordem do registro de entrada não é importante.
© 2020 HPCC Systems. All rights reserved
13
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
PARALLEL Opcional. Tenta avaliar essa atividade em paralelo.
numthreads Opcional. Tenta avaliar essa atividade usando os numthreads threads.
ALGORITHM Opcional. Substitui o algoritmo usado para essa atividade.
name O algoritmo a ser usado para essa atividade. Precisa fazer parte da lista de algoritmos com-
patíveis com as opções STABLE e UNSTABLE da função SORT.
Return: TABLE retorna uma nova tabela.
A função TABLE é similar a OUTPUT, mas, em vez de gravar registros em um arquivo, ela salva esses registros
em uma nova tabela (um novo dataset no supercomputador) na memória. A nova tabela é temporária e existe apenas
enquanto a consulta específica que a invocou está em execução.
A nova tabela herda a lógica implícita que o recordset possui (se aplicável), exceto caso a expressão opcional seja
usada para realizar a agregação. Isso significa que o registro primário está disponível ao processar registros de tabela
e que você também pode acessar o conjunto de registros secundários de cada registro de tabela. Há duas formas de
usar TABLE: a forma de "fatia vertical" e a de "relatório de referência cruzada".
Para a forma de "fatia vertical", não há um parâmetro de expressão especificado. O número de registros no recordset
de entrada é igual ao número de registros produzidos.
Para a forma de "relatório de referência cruzada", normalmente há um parâmetro de expressão e, o mais importante,
a estrutura RECORD do formato de resultado contém, no mínimo, um campo que usa uma função agregada com a
palavra-chave GROUP como seu primeiro parâmetro. O número de registros produzidos é igual ao número de valores
distintos da expressão.
Exemplo:
//"vertical slice" form:
MyFormat := RECORD
STRING25 Lname := Person.per_last_name;
Person.per_first_name;
STRING5 NewField := '';
END;
PersonTable := TABLE(Person,MyFormat);
// adding a new field is one use of this form of TABLE
//"CrossTab Report" form:
rec := RECORD
Person.per_st;
StCnt := COUNT(GROUP);
END
Mytable := TABLE(Person,rec,per_st,FEW);
// group persons by state in Mytable to produce a
 crosstab
Ver também: OUTPUT, GROUP, DATASET, Estrutura RECORD
© 2020 HPCC Systems. All rights reserved
14
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
Relatórios Cross-Tab
Relatórios de cross-tab são uma maneira bastante útil de descobrir informações estatísticas sobre os dados com os quais
você trabalha. Eles podem ser facilmente produzidos usando a função TABLE e as funções agregadas (COUNT, SUM,
MIN, MAX, AVE, VARIANCE, COVARIANCE, CORRELATION). O recordset resultante contém um único registro
para cada valor único dos campos "agrupar por" especificados na função TABLE, juntamente com as estatísticas
geradas com as funções agregadas.
Os parâmetros “agrupado por” da função TABLE são usados e duplicados como o primeiro conjunto de campos na
estrutura RECORD, seguidos por qualquer número de acionamentos de função agregados, tudo isso usando a palavra-
chave GROUP como substituto para o recordset exigido pelo primeiro parâmetro de cada uma das funções agregadas.
A palavra-chave GROUP especifica a realização de uma operação agregada no grupo e é o segredo para criar um
relatório de cross-tab. Isso cria uma tabela de resultados contendo uma linha única para cada valor único dos parâmetros
"agrupar por".
Uma CrossTab Simples
O código de exemplo abaixo (contido no arquivo CrossTab..ECL) produz um resultado de State/CountAccts com con-
tas do dataset secundário aninhado criado pelo código GenData.ECL (consulte o artigo Criando Dados de Exemplo ):
IMPORT $;
Person := $.DeclareData.PersonAccounts;
CountAccts:= COUNT(Person.Accounts);
MyReportFormat1 := RECORD
 State := Person.State;
 A1 := CountAccts;
 GroupCount := COUNT(GROUP);
END;
RepTable1 := TABLE(Person,MyReportFormat1,State,CountAccts );
OUTPUT(RepTable1);
/* The result set would look something like this:
 State A1 GroupCount
 AK 1 7
 AK 2 3
 AL 1 42
 AL 2 54
 AR 1 103
 AR 2 89
 AR 3 2 */ 
Pequenas modificações permitirão a produção de algumas estatísticas mais sofisticadas, como:
MyReportFormat2 := RECORD
 State{cardinality(56)} := Person.State;
 A1 := CountAccts;
 GroupCount := COUNT(GROUP);
 MaleCount := COUNT(GROUP,Person.Gender = 'M');
 FemaleCount := COUNT(GROUP,Person.Gender = 'F');
 END;
RepTable2 := TABLE(Person,MyReportFormat2,State,CountAccts );
OUTPUT(RepTable2);
© 2020 HPCC Systems. All rights reserved
15
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
Isso adiciona um detalhamento à contagem homens e mulheres em cada categoria, usando o segundo parâmetro op-
cional para COUNT (disponível para uso apenas em estruturas RECORD onde seu primeiro parâmetro é a palavra-
chave GROUP ).
A adição de {cardinality(56)} à definição State é uma dica para o otimizador de que há exatamente 56 valores possíveis
nesse campo, permitindo que ele selecione o melhor algoritmo para produzir o resultado da maneira mais rápida
possível.
As possibilidades são infinitas quanto ao tipo de estatísticas que podem ser geradas em relação a qualquer conjunto
de dados.
Um exemplo mais complexo
Como um exemplo levemente mais complexo, o código a seguir produz uma tabela de resultado de uma cross-tab
com o saldo médio de uma transação em um cartão bancário, média elevada do crédito em uma transação com cartão
bancário e o saldo total médio em cartões bancários, tabulados por estado e sexo.
Esse código demonstra o uso de atributos agregados separados como os parâmetros de valor para a função agregada
na cross-tab.
IsValidType(STRING1 PassedType) := PassedType IN ['O', 'R', 'I'];
IsRevolv := Person.Accounts.AcctType = 'R' OR 
 (~IsValidType(Person.Accounts.AcctType) AND 
 Person.Accounts.Account[1] IN ['4', '5', '6']);
SetBankIndCodes := ['BB', 'ON', 'FS', 'FC'];
IsBank := Person.Accounts.IndustryCode IN SetBankIndCodes;
IsBankCard := IsBank AND IsRevolv;
AvgBal := AVE(Person.Accounts(isBankCard),Balance);
TotBal := SUM(Person.Accounts(isBankCard),Balance);
AvgHC := AVE(Person.Accounts(isBankCard),HighCredit);
R1 := RECORD
 person.state;
 person.gender;
 Number := COUNT(GROUP);
 AverageBal := AVE(GROUP,AvgBal);
 AverageTotalBal := AVE(GROUP,TotBal);
 AverageHC := AVE(GROUP,AvgHC);
END;
T1 := TABLE(person, R1, state, gender);
OUTPUT(T1);
Um Exemplo Estatístico
O exemplo a seguir demonstra as funções VARIANCE, COVARIANCE e CORRELATION para analisar pontos de
grade. Ele também mostra a técnica de inserir a cross-tab em uma MACRO, acionando essa MACRO para gerar um
resultado específico em um determinado dataset.
pointRec := { REAL x, REAL y };
analyze( ds ) := MACRO
 #uniquename(rec)
 %rec% := RECORD
© 2020 HPCC Systems. All rights reserved
16
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
 c := COUNT(GROUP),
 sx := SUM(GROUP, ds.x),
 sy := SUM(GROUP, ds.y),
 sxx := SUM(GROUP, ds.x * ds.x),
 sxy := SUM(GROUP, ds.x * ds.y),
 syy := SUM(GROUP, ds.y * ds.y),
 varx := VARIANCE(GROUP, ds.x);
 vary := VARIANCE(GROUP, ds.y);
 varxy := COVARIANCE(GROUP, ds.x, ds.y);
 rc := CORRELATION(GROUP, ds.x, ds.y) ;
 END; 
 #uniquename(stats)
 %stats% := TABLE(ds,%rec% );
 OUTPUT(%stats%);
 OUTPUT(%stats%, { varx - (sxx-sx*sx/c)/c,
 vary - (syy-sy*sy/c)/c,
 varxy - (sxy-sx*sy/c)/c,
 rc - (varxy/SQRT(varx*vary)) });
 OUTPUT(%stats%, { 'bestFit: y='+(STRING)((sy-sx*varxy/varx)/c)+' 
 + '+(STRING)(varxy/varx)+'x' });
ENDMACRO;
ds1 := DATASET([{1,1},{2,2},{3,3},{4,4},{5,5},{6,6}], pointRec);
ds2 := DATASET([{1.93896e+009, 2.04482e+009},
 {1.77971e+009, 8.54858e+008},
 {2.96181e+009, 1.24848e+009},
 {2.7744e+009, 1.26357e+009},
 {1.14416e+009, 4.3429e+008},
 {3.38728e+009, 1.30238e+009},
 {3.19538e+009, 1.71177e+009} ], pointRec);
ds3 := DATASET([{1, 1.00039},
 {2, 2.07702},
 {3, 2.86158},
 {4, 3.87114},
 {5, 5.12417},
 {6, 6.20283} ], pointRec);
analyze(ds1);
analyze(ds2);
analyze(ds3); 
© 2020 HPCC Systems. All rights reserved
17
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
Exemplo de tabulação funcional
Relatórios de tabulação
Abra BWR_Training_Examples.Crosstab_Example em uma janela ECL e envie esta consulta:
MyRec := RECORD
 STRING1 Value1;
 STRING1 Value2;
 INTEGER1 Value3;
END;
SomeFile := DATASET([{'C','G',1},
 {'C','C',2},
 {'A','X',3},
 {'B','G',4},
 {'A','B',5}],MyRec);
MyOutRec := RECORD
 SomeFile.Value1;
 GrpCount := COUNT(GROUP);
 GrpSum := SUM(GROUP,SomeFile.Value3);
END;
MyTable := TABLE(SomeFile,MyOutRec,Value1);
OUTPUT(MyTable);
/* MyTable result set is:
Rec# Value1 GrpCount GrpSum
 1 C 2 3
 2 A 2 8
 3 B 1 4
*/
/*
//Example 2:
r := RECORD
 ThorFile.people_thor.lastname;
 ThorFile.people_thor.gender;
 GrpCnt := COUNT(GROUP);
 MaxLen := MAX(GROUP,LENGTH(TRIM(ThorFile.people_thor.firstname)));
END;
tbl := TABLE(ThorFile.people_thor,r,lastname,gender);
output(tbl);
/**/
© 2020 HPCC Systems. All rights reserved
18
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
Exercício 2a
Especificação do exercício:
Crie um relatório cross-tab que conte o número de valores distintos contidos no campo Gender do arquivo Persons.
Requisitos:
1. O arquivo de definição EXPORT a ser criado para este exercício é: XTAB_Persons_Gender.
2. Use a qualificação IMPORT $ conforme descrito na documentação sobre IMPORTação no PDF Referência a Lin-
guagem ECL .
Melhores práticas
O texto que antecede este exercício possui um bom código de exemplo semelhante ao que você precisará fazer.
Comparação do resultado
Use uma janela do Builder para executar uma consulta de saída simples e verifique se o resultado é:
 N 20508
 M 384182
 F 404988
 U 31722
Exercício 2b
Especificação do exercício:
Crie um relatório cross-tab que determine os valores máximo e mínimo contidos no campo High Credit do arquivo
Accounts.
Requisitos:
1. O arquivo de definição EXPORT a ser criado para este exercício é: XTAB_Accounts_HighCredit_MaxMin
2. Use a qualificação IMPORT $ conforme descrito na documentação sobre IMPORTação no PDF Referência a Lin-
guagem ECL.
Melhores práticas
Use o arquivo inteiro como a cláusula agrupar por.
Comparação do resultado
Use uma janela Builder para executar uma consulta OUTPUT simples e verifique se o resultado é:
© 2020 HPCC Systems. All rights reserved
19
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Relatórios de tabulação
 MIN Value MAX Value
 0 9999999
© 2020 HPCC Systems. All rights reserved
20
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Mais relatórios de avaliação de dados
© 2020 HPCC Systems. All rights reserved
21
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
DISTRIBUTE "Randômico"
DISTRIBUTE(recordset [, UNORDERED | ORDERED( bool ) ] [, STABLE | UNSTABLE ] [, PARALLEL [ (
numthreads ) ] ] [, ALGORITHM( name ) ] )
DISTRIBUTE(recordset, expression [, MERGE( sorts ) ] [, UNORDERED | ORDERED(bool ) ] [, STABLE |
UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
DISTRIBUTE(recordset, index [, joincondition ] [, UNORDERED | ORDERED( bool ) ] [, STABLE |
UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
DISTRIBUTE(recordset, SKEW( maxskew [, skewlimit ] ) [, UNORDERED | ORDERED( bool ) ] [, STABLE |
UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
recordset O conjunto de registros a ser distribuído.
expression Uma expressão inteira que especifica como distribuir o conjunto de registros, geralmente usando
uma das funções HASH para fins de eficiência.
MERGE Especifica que os dados são redistribuídos, mantendo a ordem de classificação local em cada nó.
sorts As expressões de classificação pelas quais os dados foram localmente classificados.
index O nome da definição de um atributo INDEX , que fornece a distribuição adequada.
joincondition Opcional. Uma expressão lógica que especifica como vincular os registros ao conjunto de reg-
istros e índice. As palavras-chave LEFT e RIGHT podem ser usadas como qualificadores de
dataset nos campos do recordset e do índice.
SKEW Especifica os valores de distorção de dados permitidos.
maxskew Um número de ponto flutuante no intervalo de zero (0,0) a um (1,0) especificando a distorção
mínima a ser permitida (0,1=10%).
skewlimit Opcional. Um número de ponto flutuante no intervalo de zero (0,0) a um (1,0) especificando a
distorção máxima a ser permitida (0,1=10%).
UNORDERED Opcional. Especifica que a ordem do registro de resultado não é importante.
ORDERED Especifica a importância da ordem do registro de resultado.
bool Quando for “False” (Falso), especifica que a ordem do registro de resultado não é importante.
Quando for “True’ (Verdadeiro), especifica a ordem padrão do registro de resultado.
STABLE Opcional. Especifica que a ordem do registro de entrada é importante.
UNSTABLE Opcional. Especifica que a ordem do registro de entrada não é importante.
PARALLEL Opcional. Tenta avaliar essa atividade em paralelo.
numthreads Opcional. Tenta avaliar essa atividade usando os numthreads threads
ALGORITHM Opcional. Substitui o algoritmo usado para essa atividade.
name O algoritmo a ser usado para essa atividade. Precisa fazer parte da lista de algoritmos compatíveis
com as opções STABLE e UNSTABLE da função SORT.
Return: DISTRIBUTE retorna um conjunto de registros.
A função DISTRIBUTE redistribui registros do recordset para todos os nós do cluster.
“Random” DISTRIBUTE
DISTRIBUTE(recordset )
© 2020 HPCC Systems. All rights reserved
22
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Esta forma redistribui o recordset "aleatoriamente" para que não haja distorção de dados entre os nós, porém sem
as desvantagens que a função RANDOM() poderia introduzir. Isso é funcionalmente equivalente a distribuição do
registro inteiro através de uma hash.
Expressão DISTRIBUTE
DISTRIBUTE(recordset, expression )
Esta forma redistribui o recordset com base na expressão especificada, normalmente uma das funções HASH . Somente
os 32 bits inferiores do valor da expressão são usados; portanto, HASH ou HASH32 são a escolha ideal. Os registros
para os quais a expressão apresenta o mesmo resultado que estão no mesmo nó. DISTRIBUTE executa implicitamente
uma operação de módulo se o valor da expressão não estiver no intervalo do número de nós disponíveis.
Se a opção MERGE for especificada, o recordset precisa ter sido classificado localmente pelas expressões sort . Isso
evita uma reclassificação.
DISTRIBUTE baseado em Index
DISTRIBUTE(recordset, index [, joincondition ] )
Esta forma redistribui o recordset com base na distribuição existente do index especificado, onde a ligação entre os
dois é determinada pela joincondition. Os registros para os quais a joincondition é true (verdadeira) terminarão no
mesmo nó.
DISTRIBUTE baseado em Skew
DISTRIBUTE(recordset, SKEW( maxskew [, skewlimit ] ) )
Esta forma redistribui o recordset , mas apenas se for necessário. A finalidade desta forma é substituir o uso de
DISTRIBUTE(recordset,RANDOM()) para apenas obter uma distribuição relativamente uniforme dos dados entre os
nós. Esta forma sempre tentará minimizar a quantidade de dados redistribuídos entre os nós.
A distorção de um dataset é calculada da seguinte forma:
MAX(ABS(AvgPartSize-PartSize[node])/AvgPartSize)
Se a distorção do recordset for menor do que a do maxskew , então DISTRIBUTE será não operacional. Se o limite de
distorção for especificado e se a distorção em qualquer nó exceder esse limite, a tarefa falhará e exibirá uma mensagem
de erro (especificando o número do primeiro nó que excedeu o limite); caso contrário, os dados são redistribuídos para
garantir que os dados sejam distribuídos com menor distorção que maxskew.
Exemplo:
MySet1 := DISTRIBUTE(Person); //"random" distribution - no skew
MySet2 := DISTRIBUTE(Person,HASH32(Person.per_ssn));
 //all people with the same SSN end up on the same node
 //INDEX example:
mainRecord := RECORD
 INTEGER8 sequence;
 STRING20 forename; 
 STRING20 surname;
 UNSIGNED8 filepos{virtual(fileposition)};
END;
mainTable := DATASET('~keyed.d00',mainRecord,THOR);
nameKey := INDEX(mainTable, {surname,forename,filepos}, 'name.idx');
incTable := DATASET('~inc.d00',mainRecord,THOR);
x := DISTRIBUTE(incTable, nameKey,
© 2020 HPCC Systems. All rights reserved
23
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
 LEFT.surname = RIGHT.surname AND
 LEFT.forename = RIGHT.forename);
OUTPUT(x);
//SKEW example:
Jds := JOIN(somedata,otherdata,LEFT.sysid=RIGHT.sysid);
Jds_dist1 := DISTRIBUTE(Jds,SKEW(0.1));
 //ensures skew is less than 10%
Jds_dist2 := DISTRIBUTE(Jds,SKEW(0.1,0.5));
 //ensures skew is less than 10%
 //and fails if skew exceeds 50% on any node
Ver também: HASH32, DISTRIBUTED, INDEX
© 2020 HPCC Systems. All rights reserved
24
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
HASH32
HASH32(expressionlist)
expressionlist Uma lista de valores delimitada por vírgula.
Return: HASH32 retorna um único valor.
A função HASH32 retorna um valor hash de 32 bits derivado de todos os valores da expressionlist. Ela usa um
algoritmo hashing que é mais rápido e menos provável do que o HASH para retornar os mesmos valores a partir de
dados diferentes. Espaços no final da string são removidos (ou UNICODE) antes de o valor ser calculado (a conversão
para DATA impede isso).
Exemplo:
MySet := DISTRIBUTE(Person,HASH32(Person.per_ssn));
 //people with the same SSN go to same Data Refinery node
Ver também: DISTRIBUTE, HASH, HASH64, HASHCRC, HASHMD5
© 2020 HPCC Systems. All rights reserved
25
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Exercício 3a
Especificação do exercício:
Criar um código Builder Window Runnable (BWR) que determina a cardinalidade do campo Bureau Code do arquivo
Persons.
A cardinalidade do campo é definida como o número de valores únicos contidos no campo.
O código BWR é definido como código ECL projetado para ser executado em uma janela do Builder, mas é armazenado
no Repositório da mesma maneira que qualquer definição ECL. Isso implica várias coisas:
* Deve conter pelo menos uma ação (explícita ou implícita).
* Todos os atributos referenciados do Repositório devem ser totalmente qualificados (ou referenciados pelo IMPORT).
* Não contém atributos EXPORT ou SHARED (significa que só pode ser aberta em uma janela do Builder e executado).
Requisitos:
O arquivo de definição a ser criado para este exercício é: BWR_Persons_BureauCode_Cardinality
OBSERVAÇÃO: NÃO use um relatório CrossTab para concluir este exercício! Consulte a seção Melhores
Práticas abaixo para obter mais detalhes.
Melhores práticas
1. Use o formulário "vertical slice" de TABLE para limitar os dados.
2. Use a funçãoDISTRIBUTE para permitir o uso da opção LOCAL em operações subsequentes.
Comparação do resultado
Abra o código em uma janela do Builder e execute-o. Verifique se o resultado é 303.
© 2020 HPCC Systems. All rights reserved
26
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Exercício 3b
Especificação do exercício:
Criar código Builder Window Runnable (BWR) que determina a população no campo Dependent Count do arquivo
Persons.
A população é definida como a porcentagem de registros que contêm valores diferentes de valores "nulos" (geralmente
espaços em branco ou zeros).
Requisitos:
O arquivo de definição a ser criado para este exercício é: BWR_Persons_DependentCount_Population
Melhores práticas
1. Use uma definição DATASET em linha para produzir a saída.
Comparação do resultado
Abra o código em uma janela do Builder e execute-o. Verifique se o resultado é:
 Total Records 841400
 Recs=0 841400
 Population Pct 0
© 2020 HPCC Systems. All rights reserved
27
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Padrões dos Dados
A funcionalidade Padrão dos Dados (definido como DataPatterns) é um pacote ECL que fornece algumas ferramen-
tas básicas de perfil e pesquisa de dados para um programador de ECL. Agora, esse pacote está integrado a todos os
relatórios de informações de arquivos lógicos no ECL Watch. Clique na aba Data Patterns do arquivo e, em seguida,
Analyze para iniciar a geração do relatório. Nota: seu arquivo lógico deve ter informações de ECL RECORD para
iniciar o relatório. No entanto, com a instalação do pacote configurável, você pode executar sua própria análise a
qualquer momento a partir de qualquer workunit ECL. OBSERVAÇÃO: A partir do HPCC Versão 7.6, as FUNC-
TIONMACROs usadas no pacote DataPatterns agora estão integradas à Referência da Biblioteca Padrão (consulte
STD.DataPatterns). Esta seção se concentrará apenas na instalação do pacote.
Instalação
DataPatterns é instalado como um pacote ECL. Instruções completas para gerenciar pacotes ECL podem ser encon-
tradas na documentação em PDF ECL IDE e no HPCC ClientTools. Use a ferramenta de linha de comando ECL para
instalar este pacote configurável:
ecl bundle install https://github.com/hpcc-systems/DataPatterns.git
Pode ser necessário navegar para o diretório bin das ferramentas do cliente antes de executar o comando ou usar o
caminho completo para o executável ecl. Após a instalação, todo o código fica disponível aqui após a importação:
IMPORT DataPatterns;
Observe que é possível usar esse código sem instalá-lo como um pacote. Para fazer isso, basta disponibilizá-lo no seu
IDE e ignorar o arquivo Bundle.ecl. Com o IDE do Windows, o diretório DataPatterns não deve ser um item de nível
superior na sua lista de repositórios; ele precisa ser instalado um nível abaixo do nível superior, como, por exemplo,
abaixo da pasta "Meus arquivos".
A FunctionMacro Profile
Profile() é um FUNCTIONMACRO para criar um perfil de todo ou parte de um dataset. A saída é um dataset que
contém as seguintes informações para cada atributo com perfil:
attribute O nome do atributo.
given_attribute_type O tipo de ECL do atributo conforme definido no dataset de entrada
best_attribute_type Um tipo de dados ECL que permite todos os valores no dataset de entrada e consome
a menor quantidade de memória
rec_count O número de registros analisados no dataset; isso pode ser menor que o número total
de registros, se o argumento sampleSize opcional tiver sido fornecido com um valor
menor que 10
fill_count O número de registros rec_count contendo valores diferentes de zero; um 'valor nulo'
é uma string vazia, um zero numérico ou um SET vazio; observe que os atributos
BOOLEAN são sempre contados como preenchidos, independentemente de seu val-
or; Além disso, os atributos DATA de comprimento fixo (por exemplo, DATA10)
também são contados como preenchidos, dada sua função típica de reter blobs de
dados.
fill_rate A porcentagem de registros rec_count contendo valores diferentes de zero; isso é
basicamente fill_count / rec_count * 100 cardinality
cardinality O número de valores únicos e diferentes de zero do atributo
© 2020 HPCC Systems. All rights reserved
28
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
cardinality_breakdown Para os atributos com um número baixo de valores únicos e não-nulos, mostre cada
valor e o número de registros que contêm esse valor; o parâmetro lcbLimit controla
o valor do "número baixo".
modes Os valores mais comuns no atributo, depois de converter todos os valores para
STRING, juntamente com o número de registros nos quais os valores foram encon-
trados; se nenhum valor for repetido mais de uma vez, nenhum modo será mostrado;
até cinco (5) modos serão mostrados; observe que valores de STRING maiores que
o argumento maxPatternLen serão truncados
min_length Para tipos de dados SET, o menor número de elementos encontrado no conjunto;
para outros tipos de dados, o menor comprimento de um valor quando expresso como
uma STRING; valores nulos são ignorados
max_length Para tipos de dados SET, o maior número de elementos encontrados no conjunto;
para outros tipos de dados, o maior comprimento de um valor quando expresso como
uma STRING; valores nulos são ignorados
ave_length Para tipos de dados SET, o número médio de elementos encontrados no conjunto;
para outros tipos de dados, o comprimento médio de um valor quando expresso
popular_patterns Os padrões mais comuns de valores (veja abaixo)
rare_patterns Os padrões menos comuns de valores (veja abaixo).
is_numeric. Booleano indicando se o atributo original era um número escalar ou se o valor
best_attribute_type era um número escalar; se TRUE, os campos de saída numer-
ic_xxxx serão preenchidos com valores reais; se esse valor for FALSE , todos os
valores de saída numeric_xxxx devem ser ignorados
numeric_min O menor valor não nulo encontrado no atributo como DECIMAL; esse valor é válido
apenas se is_numeric for TRUE; se is_numeric for FALSE, zero será mostrado aqui
numeric_max O maior valor não-nulo encontrado no atributo como DECIMAL; esse valor é válido
apenas se is_numeric for TRUE; se is_numeric for FALSE, zero será mostrado aqui
numeric_mean O menor valor não nulo encontrado no atributo como DECIMAL; esse valor é válido
apenas se is_numeric for TRUE; se is_numeric for FALSE, zero será mostrado aqui
numeric_std_dev O desvio padrão dos valores não nulos no atributo como DECIMAL; esse valor é
válido apenas se is_numeric for TRUE; se is_numeric for FALSE, zero será mostra-
do aqui
numeric_lower_quartile O valor que separa o primeiro (inferior) e o segundo quartil de valores diferentes
de zero no atributo como DECIMAL; esse valor é válido apenas se is_numeric for
TRUE; se is_numeric for FALSE, zero será mostrado aqui
numeric_median O valor mediano não nulo no atributo como DECIMAL; esse valor é válido apenas
se is_numeric for TRUE; se is_numeric for FALSE, zero será mostrado aqui
numeric_upper_quartile O valor que separa o terceiro e quarto (superior) quartil de valores não nulos dentro
do atributo como DECIMAL; esse valor é válido apenas se is_numeric for TRUE;
se is_numeric for FALSE, zero será mostrado aqui
correlations Um dataset filho contendo valores de correlação comparando o atributo numérico
atual com todos os outros atributos numéricos, listados em ordem decrescente do
valor de correlação; o atributo deve ser um tipo de dado numérico da ECL; atributos
não numéricos retornarão um conjunto de dados filho vazio; observe que essa pode
ser uma operação demorada, dependendo do número de atributos numéricos no seu
conjunto de dados e do número de linhas (se você tiver N atributos numéricos, serão
executados N * (N - 1) / 2 cálculos, cada um verificando todas as linhas de dados)
A maioria das saídas do profile() pode ser desativada (consulte as informações sobre os recursosabaixo).
© 2020 HPCC Systems. All rights reserved
29
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Os padrões de dados podem fornecer uma ideia da aparência de seus dados quando expressos como uma string (legível
por humanos). A função converte cada caractere da cadeia de caracteres em uma paleta de caracteres fixa para produzir
um "data pattern" e, em seguida, conta o número de padrões exclusivos para esse atributo. Os padrões mais e menos
populares dos dados serão mostrados na saída, juntamente com o número de vezes que o padrão aparece e de um
exemplo (escolhido aleatoriamente a partir dos dados reais). A paleta de caracteres usada é:
A - Qualquer letra maiúscula
a - Qualquer letra maiúscula
9 - Qualquer dígito numérico
B - Um valor booleano (verdadeiro ou falso)
Todos os outros caracteres são deixados como estão no padrão.
PROFILE(inFile, fieldListStr, maxPatterns, maxPatternLen, features, sampleSize, lcbLimit)
Parâmetros da função:
infile O conjunto de dados a ser processado; pode ser um dataset filho (por exemplo, inFile.childDS);
REQUERIDO
fieldListStr Uma string contendo uma lista delimitada por vírgula de nomes de atributos a serem processa-
dos; observe que os atributos listados aqui devem ser tipos de dados escalares (não registros
filhos ou dataset filhos); use uma string vazia para processar todos os atributos no inFile;
OPCIONAL, o padrão é uma string vazia
maxPatterns O número máximo de padrões (populares e raros) a serem retornados para cada atributo;
OPCIONAL, o padrão é 100
maxPatternLen O comprimento máximo de um padrão; padrões mais longos são truncados na saída; esse valor
também é usado para definir o comprimento máximo dos dados a serem considerados ao en-
contrar os valores de cardinalidade e modo; deve ser 33 ou maior; OPCIONAL, o padrão é 100
features Uma cadeia de caracteres delimitada por vírgula, listando os elementos de criação de perfil a
serem incluídos na saída; OPCIONAL, o padrão é uma sequência delimitada por vírgula que
contém todas as palavras-chave disponíveis:
KEYWORD -----------------AFFECTED KEYWORD
fill_rate -----------------------fill_rate,fill_count
cardinality -------------------cardinality
cardinality_beakdown ----cardinality_breakdown
best_ecl_types -------------best_attribute_type
modes ------------------------modes
lengths -----------------------min_length,max_length,ave_length
patterns ----------------------popular_patterns,rare_patterns
min_max ---------------------numeric_min,numeric_max
mean -------------------------numeric_mean
std_dev ----------------------numeric_std_dev
quartiles ---------------------numeric_lower_quartile, numeric_median, numeric_upper_quartile
correlations -----------------correlations
Para omitir a saída associada a uma única palavra-chave, defina esse argumento como uma
string delimitada por vírgula contendo todas as outras palavras-chave; observe que a saída
© 2020 HPCC Systems. All rights reserved
30
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
is_numeric aparecerá apenas se os recursos min_max, mean, std_dev, quartis ou correlations
estiverem ativos; Observe também que a ativação do recurso cardinality_breakdown também
ativará o recurso cardinalidade, mesmo se não estiver explicitamente ativado
sampleSize Um número inteiro positivo representando uma porcentagem do inFile a ser examinado, que
é útil ao analisar um dataset muito grande e apenas um perfil de dados estimado é suficiente;
o intervalo válido para esse argumento é 1-100; valores fora desse intervalo serão fixados;
OPCIONAL, o padrão é 100 (o que indica que todo o conjunto de dados será analisado)
lcbLimit Um número inteiro positivo (menor ou igual a 500) indicando a cardinalidade máxima permiti-
da para um atributo para emitir uma discriminação dos valores do atributo; este parâmetro será
ignorado se cardinality_breakdown não estiver incluído no argumento de recursos; OPCION-
AL, o padrão é 64
Aqui está um exemplo muito simples de executar o código completo de criação de perfil de dados:
IMPORT DataPatterns;
filePath := '~thor::my_sample_data';
ds := DATASET(filePath, RECORDOF(filePath, LOOKUP), FLAT);
profileResults := DataPatterns.Profile(ds);
OUTPUT(profileResults, ALL, NAMED('profileResults'));
© 2020 HPCC Systems. All rights reserved
31
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Visualização
O HPCC Systems fornece visualização integrada dos dados de saída em uma variedade de tabelas e gráficos. Você
pode visualizar seus dados de três maneiras:
• Usando a ferramenta Chart no ECL Playground
• Acessando a aba Visualize em todas as ECL workunits
• Usando a aba Resources em conjunto com o pacote ECL Visualizer
O pacote de visualização é um complemento de código aberto para a plataforma HPCC para permitir que você crie
visualizações a partir de consultas gravadas em ECL.
As visualizações são um meio importante de transmitir informações de dados maciços (ou "grandes"). Uma boa rep-
resentação visual pode ajudar a gerar uma análise acionável. Uma representação visualmente abrangente das infor-
mações pode ajudar a tornar o obscuro em algo mais óbvio.
Gráficos de pizza, linha, mapas, e outros gráficos nos ajudam a entender as respostas encontradas nas consultas de
dados. O processamento de big data é apenas uma parte da solução; também é preciso compreender a complexidade
dos dados. Os métodos de visualização dos dados simplificam aquilo que é complexo.
O pacote Visualizer amplia a funcionalidade da plataforma HPCC, permitindo plotar seus dados em tabelas, gráficos
e mapas para adicionar uma representação visual que pode ser facilmente entendida.
Além disso, a estrutura de visualização subjacente suporta recursos avançados para permitir a combinação de gráficos
para criar dashboards.
Instalação
Para instalar, use a interface da linha de comandos da ECL.
1. Faça o download: https://github.com/hpcc-systems/Visualizer/archive/master.zip
2. Descompacte na pasta “Visualizer”: …\Downloads\Visualizer-master.zip -> …\Downloads\Visualizer
3. Instale usando a interface da linha de comandos: ecl bundle install %USERPROFILE%\Downloads\Visualizer
Como alternativa, você pode instalar diretamente do GitHub:
ecl bundle install https://github.com/hpcc-systems/Visualizer.git
Na instalação bem-sucedida, você verá a seguinte mensagem:
Instalando o Pacote Visualizer versão 2.0.0
Visualizer 2.0.0 ECL Visualization
Bundle Installation complete
Observação: Você pode achar mais fácil definir o PATH manualmente para incluir as ferramentas do cliente ECL:
set PATH=%PATH%;"c:\Program Files (x86)\HPCCSystems\7.4.0\clienttools\bin"
Observação: Para usar o comando "ecl bundle install <git url>", o git deve estar instalado na sua máquina e acessível
ao usuário (na variável PATH).
© 2020 HPCC Systems. All rights reserved
32
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Categorias de visualização
O pacote de visualização separa elementos visuais em 6 categorias. Cada função em sua categoria compartilha parâmet-
ros comuns , na maioria dos casos, renderização visual semelhante. Cada categoria também possui uma função de Test
integrada para ajudá-lo a obter uma visualização rápida dos elementos visuais visados.
Funções de visualização global (helper)
Cada um dos tipos de gráficos de visualização individuais conta com as duas (2) funções principais a seguir para
auxiliar na execução:
• Meta
Cria um conjunto de registros de saída especial que contém as meta informações para uso na visualização de destino.
Visualização dos resultados da meta-informação.
• Grid
Usado com a função Meta para renderizar dados na grade ou tabela de dados apropriada. Os mapeamentos podem ser
usados para limitar e/ou renomear as colunas.
Ambas as funções podem ser usadas fora da visualização para simplesmentemapear seus dados, conforme necessário.
Uma função de teste localizada no Visualizer Any também é fornecida para visualizar seus resultados:
IMPORT Visualizer;
Visualizer.Any.__test;
//View the results in the Workunit Resource Tab.
Visualizações "ordinais" bidimensionais
As visualizações nesta categoria são ideais para dados expressos com dois campos, um Label (string) e um Value
(número). Todos os outros campos no dataset são ignorados.
Existem cinco funções principais nessa categoria, localizadas na estrutura TwoD MODULE:
• Bubble - uma série de círculos cujo tamanho é proporcional ao valor do campo
• Pie - um único círculo dividido em fatias proporcionais
• Summary - valores são exibidos em intervalos designados
• RadialBar - basicamente um gráfico de barras plotado em coordenadas polares, em vez de um plano cartesiano.
• WordCloud - uma representação visual de dados de texto, cujo tamanho é proporcional ao seu valor.
Teste e visualize todas essas funções com a seguinte função de teste:
IMPORT Visualizer;
Visualizer.TwoD.__test;
Visualizações "lineares" bidimensionais
As visualizações nesta categoria usam os gráficos de valores X/Y padrão, também conhecidos como coordenadas
cartesianas, e usam um ValueX (número) e um ValueY (número). Todos os outros campos no dataset são ignorados.
© 2020 HPCC Systems. All rights reserved
33
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Existem três (3) funções principais nessa categoria, localizadas no TwoDLinear Estrutura MODULE:
• Scatter - usa coordenadas cartesianas (X/Y) para exibir valores de ponto para dois campos numéricos em um dataset
• HexBin - útil para representar 2 campos numéricos quando você possui muitos pontos de dados. Em vez de se
sobrepor, a janela de plotagem é dividida em vários hexbins e o número de pontos por hexbin é contado. A cor indica
esse número de pontos.
• Contour - uma técnica gráfica que usa linhas de contorno. Uma linha de contorno de uma função de duas variáveis
é uma curva ao longo da qual a função tem um valor constante, de modo que a curva une pontos de igual valor.
Teste e visualize todas essas funções com a seguinte função de teste:
IMPORT Visualizer;
Visualizer.TwoDLinear.__test;
Visualizações multidimensionais
As visualizações nesta categoria são ideais para qualquer matriz numérica de valores, expressa com um Label (string),
e umValue1 a ValueN (todos os números). Os dados são renderizados em um gráfico de eixo XY. Todos os outros
campos no dataset são ignorados.
Existem sete (7) funções principais nessa categoria, localizadas na estrutura MultiD MODULE :
• Area - a legenda é plotada no eixo X, e os valores de cada etiqueta são plotados no eixo Y. Os campos comuns são
unidos por linha e a área abaixo é sombreada.
• Bar - a legenda é plotada no eixo Y e os valores para cada gráfico da barra no eixo X.
• Column - semelhante ao Bar, mas o rótulo é plotado no eixo X e os valores associados são representados por barra
no eixo Y.
• Line - semelhante ao Area, mas nenhuma área sombreada é colorida (somente linhas)
• Radar - semelhante ao Area , mas usa um ponto central em um círculo para as coordenadas zero dos eixos X e Y.
Pense em um escopo de radar para esse tipo de gráfico.
• Scatter - os pontos são marcados apenas neste tipo de gráfico
• Step - usa linhas verticais e horizontais para conectar pontos de dados, semelhante a um tipo de exibição em degraus.
Teste e visualize todas essas funções com a seguinte função de teste:
IMPORT Visualizer;
Visualizer.MultiD.__test;
Método de Visualização Geoespacial
Há um único tipo de gráfico nessa categoria que renderiza dados em um gráfico de relação de entidades. Os dados são
mapeados a partir de duas tabelas. A primeira tabela controla os vértices (nós) e cada nó contém três campos; uma
coluna de ID usando qualquer tipo de dados, uma string Label e uma string Icon. Esses vértices são conectados por
arestas (ou links) e cada aresta contém no mínimo 2 campos que unem ou conectam os vértices. O primeiro campo
é um Source ID e o segundo campo é um Target ID. Por exemplo, se eu tiver 3 vértices definidos; Casa - 1, Mulher
- 2 e Homem -3, um registro de limite {1,2} vinculará Casa(1) a Mulher(2) e um registro de limite {1,3} vinculará
Casa(1) a Homem (3). Um registro de limite {3,2} vincularia Homem(3) a Mulher(2) (consulte a função Test para
obter uma ilustração disso).
© 2020 HPCC Systems. All rights reserved
34
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Existe uma única função nesta categoria localizada na estrutura Relational MODULE:
• Network - monta os vértices e arestas definidos em um gráfico de relação de entidades
Teste e visualize este gráfico com a seguinte função de teste:
IMPORT Visualizer;
Visualizer.Relational.__test;
Método de Visualização Geoespacial
As visualizações geoespaciais são essencialmente gráficos de mapas, visualizando um valor com uma localização
específica. Os dados geoespaciais são expressos com dois campos, o Field 1 é uma STRING que contém um Location
Id (dependendo do tipo de gráfico) e um Value (número) que identifica ou colore um local. Todos os outros campos
no dataset são ignorados. Os mapeamentos em cada função podem ser usados para associar os campos no dataset de
destino aos campos do gráfico.
Existem cinco funções principais nessa categoria, localizadas na estrutura MODULE Choropleth :
• USStates - Um mapa de estados do EUA que mapeia um código de estado de duas letras com seu valor associado.
• USCounties - Um mapa do estado do EUA que mapeia um código numérico do condado FIPS (Federal Information
Processing Standard) com seu valor associado.
• Euro - um gráfico de mapa base que permite selecionar qualquer país do continente europeu. Um código internacional
de duas letras é necessário para a região.
• EuroIE - Exemplo de função no pacote que usa a função Euro para mostrar o mapa da Irlanda.
• EuroGB - Exemplo de função no pacote que usa a função Euro para mostrar o mapa da Grã-Bretanha.
Teste e visualize todas essas funções com a seguinte função de teste:
IMPORT Visualizer;
Visualizer.Choropleth.__test;
Início Rápido
O uso do pacote de visualização é essencialmente um processo de três etapas.
1. Prepare seus dados. Muitos pontos podem tornar um gráfico ilegível, poucos pontos diminuem o benefício da análise.
2. Importe a pasta Visualizer. Se você usar o método "git", sua pasta será facilmente localizada.
3. OUTPUT do seus dados usando o atributo NAMED.
4. Chame seu Visualizador gráfico usando o atributo NAMED como sua fonte de gráfico
Exemplo:
IMPORT $, Visualizer;
GenderDS := DATASET([{'Female', 404988}, 
 {'Male', 384182}, 
 {'Neutral', 20508}, 
 {'Unknown', 70722}],
 {STRING Label,UNSIGNED4 Value});
© 2020 HPCC Systems. All rights reserved
35
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
OUTPUT(GenderDS,NAMED('VizPie'));
Visualizer.TwoD.Pie('Pie',,'VizPie');
© 2020 HPCC Systems. All rights reserved
36
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Exercício 3c
Especificação do exercício:
Execute uma análise detalhada do perfil do campo do dataset de treinamento Persons usando a função built-in Profile
encontrada na Biblioteca Padrão.
Requisitos:
1. O arquivo de definição a ser criado para este exercício é: BWR_Persons_DP
2. Chame a função STD.DataPatterns.Profile que passa o dataset Person EXPORTado como parâmetro. DICA:
Você precisará IMPORTar uma referência da Biblioteca Padrão.
3. Gere a saída dos resultados e verifique se os resultados parecem razoáveis.
4. Extra: O que o BestRecordStructure diz sobre a estrutura RECORD que você está usando?
Melhores práticas
As funções Data Patterns Profile e BestRecordStructure são ferramentas valiosas que fornecemuma análise detal-
hada de qualquer conjunto de dados. É possível analisar Data Patterns nas informações de arquivos lógicos no ECL
Watch ou executar sua própria criação de perfil usando o pacote configurável ou a Biblioteca PadrãoDataPatterns .
Comparação do resultado
Envie os resultados do perfil no ECL IDE, no ECL Watch e analise com sua turma e instrutor.
© 2020 HPCC Systems. All rights reserved
37
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Mais relatórios de avaliação de dados
Exercício 3d
Especificação do exercício:
Gere e exiba um Gráfico de Mapa de Coropletos do USStates que reflete a população por estado do dataset Persons.
Use um arquivo BWR (Builder Window Runnable) para exibir o resultado.
Requisitos:
1. O arquivo de definição a ser criado para este exercício é: BWR_StatePopulation
2. Crie um relatório de tabulação cruzada que produz COUNTs por estado.
3. Faça OUTPUT do seu relatório cross-tab e atribua ao resultado um atributo NAMED.
4. Consulte o Manual de Treinamento e instale o pacote do Visualizer usando a técnica git especificada (NOTA: Você
também precisará do Git for Windows instalado em sua máquina).
5. Depois que o pacote Visualizer estiver instalado, chame o mapa cloroplético USStates da seguinte maneira:
Visualizer.Choropleth.USStates('usStates',,'yourNAMEDattributeHere');
Melhores práticas
A chave para uma ótima visualização é entender os dados com os quais você está trabalhando. Muitos pontos de dados
podem distorcer e dificultar a leitura do gráfico, e poucos pontos podem diluir a análise. Use a opção Visualize na
workunit do ECL Watch e experimente os diferentes estilos de gráfico disponíveis. Depois de encontrar o gráfico que
você está procurando, chame a função Visualizer apropriada para renderizar o resultado na aba Resources. A URL na
aba Resources pode ser distribuída ao seu usuário final.
Comparação do resultado
Veja seu resultado na aba ECL Watch Resources da sua workunit. Você deve ver um mapa dos Estados Unidos e a
população por estado claramente marcada.
© 2020 HPCC Systems. All rights reserved
38
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Transformações simples
Estrutura TRANSFORM
resulttype funcname ( parameterlist ) := TRANSFORM [, SKIP( condition )]
[ locals ]
SELF.outfield := transformation;
END;
TRANSFORM( resulttype, assignments )
TRANSFORM( datarow )
resulttype O nome de um Atributo da estrutura RECORD que especifica o formato dos resulta-
dos da função. Você pode usar TYPEOF aqui para especificar um dataset. Nenhuma
relação implícita do dataset de entrada é herdada.
funcname O nome da função definida pela estrutura TRANSFORM.
parameterlist Uma lista separada por vírgulas dos tipos de valores e rótulos dos parâmetros a serem
passados para a função TRANSFORM. Normalmente, são registros de dataset ou
parâmetros de COUNTER, mas não estão limitados a isso.
SKIP Opcional. Especifica a condition na qual a operação da função TRANSFORM é igno-
rada.
condition Uma expressão lógica que define em que circunstâncias a operação de TRANSFORM
não ocorre. Pode usar dados de parameterlist da mesma forma que a expressão trans-
formation .
locals Opcional. Definições de Atributos locais, úteis dentro da função TRANSFORM. Po-
dem ser definidos para receber parâmetros e podem usar qualquer parâmetro passado
para TRANSFORM.
SELF Especifica o conjunto de registros dos resultados gerados por TRANSFORM.
outfield O nome de um campo na estrutura resulttype .
transformation Uma expressão que especifica como produzir o valor de outfield. Isso pode incluir
outras operações da função TRANSFORM (transformações aninhadas).
assignments Uma lista delimitada por ponto e vírgula de definições SELF.outfield:= transformation
.
datarow Um único registro a transformar. Normalmente, a palavra-chave LEFT.
A estrutura TRANSFORM possibilita operações que devem ser executadas em datasets inteiros (como um JOIN)
e qualquer tipo iterativo de processamento de registros (PROJECT, ITERATE, etc.). Uma estrutura TRANSFORM
define as operações específicas que devem ocorrer registro a registro. Ela define a função chamada a cada vez que
a operação que usa TRANSFORM precisa processar registro(s). Uma função TRANSFORM pode ser definida em
termos de outra, e elas podem ser aninhadas.
A estrutura TRANSFORM especifica exatamente como cada campo do conjunto de resultados deve receber seu valor.
O valor do resultado pode ser simplesmente o valor de um campo em um conjunto de registros de entrada ou pode ser
o resultado de algum cálculo complexo ou avaliação de expressão condicional.
© 2020 HPCC Systems. All rights reserved
39
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
A estrutura TRANSFORM em si é uma ferramenta genérica. Cada operação que usa uma função TRANSFORM define
o que TRANSFORM precisa receber e qual funcionalidade básica deve fornecer. Portanto, o caminho correto para
compreender estruturas TRANSFORM é entender como são usadas pela função que chama a estrutura. Cada função
que usa um TRANSFORM documenta o tipo necessário para alcançar o objetivo, embora a própria TRANSFORM
também possa fornecer funcionalidades adicionais e receber outros parâmetros além dos necessários para a operação.
A opção SKIP especifica a condition que não gera resultados dessa iteração de TRANSFORM. No entanto, os valores
COUNTER são incrementados mesmo quando SKIP elimina a criação do registro atual.
Definições dos Atributos de Transformação
As definições de atributos dentro da estrutura TRANSFORM são usadas para converter os dados passados como
parâmetros para o formato resulttype nos resultados. Cada campo no layout do registro resulttype deve ser completa-
mente definido no TRANSFORM. Você pode definir explicitamente cada campo usando a expressão SELF.outfield
:= transformation; , ou pode usar um destes atalhos:
SELF := [ ];
limpa campos nos resultados de resulttype que não foram definidos previamente na função de transformação, ao passo
que este formato:
SELF.outfield := []; //the outfield names a child DATASET in
 // the resulttype RECORD Structure
limpa apenas os campos secundários em outfield, e este formato:
SELF := label; //the label names a RECORD structure parameter
// in the parameterlist
define os resultados de cada campo no formato de resultados de resulttype que não foi definido como oriundo do
campo nomeado correspondente do parâmetro label.
Você também pode definir atributos local dentro da estrutura TRANSFORM para organizar melhor o código. Esses
atributos local podem receber parâmetros.
Funções TRANSFORM
Esse formato de TRANSFORM deve ser encerrado pela palavra-chave END. O resulttype deve ser especificado, e
a própria função recebe parâmetros em parameterlist. Normalmente, esses parâmetros são estruturas RECORD, mas
podem ser qualquer tipo de parâmetro, dependendo do tipo de função TRANSFORM esperado pela função que faz
a chamada. O formato exato de uma função TRANSFORM está sempre associado diretamente à operação que usa
essa função.
Exemplo:
Ages := RECORD
 AgedRecs.id;
 AgedRecs.id1;
 AgedRecs.id2;
END;
SequencedAges := RECORD
 Ages;
 INTEGER4 Sequence := 0;
END;
SequencedAges AddSequence(AgedRecs L, INTEGER C) :=
 TRANSFORM, SKIP(C % 2 = 0) //skip even recs
 INTEGER1 rangex(UNSIGNED4 divisor) := (l.id DIV divisor) % 100;
 SELF.id1 := rangex(10000);
© 2020 HPCC Systems. All rights reserved
40
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
 SELF.id2 := rangex(100);
 SELF.Sequence := C;
 SELF := L;
END;
SequencedAgedRecs := PROJECT(AgedRecs, AddSequence(LEFT,COUNTER));
//Example of defining a TRANSFORM function in terms of another
namesIdRecord assignId(namesRecord l, UNSIGNED value) := TRANSFORM
 SELF.id := value;
 SELF := l;
END;
assignId1(namesRecord l) := assignId(l, 1);
 //creates an assignId1 TRANSFORM that uses assignId
assignId2(namesRecordl) := assignId(l, 2);
 //creates an assignId2 TRANSFORM that uses assignId
TRANSFORMs em linha
Este formato de TRANSFORM é usado em linha dentro da operação que usa a função. O resulttype deve ser especi-
ficado juntamente com todos os assignments. Esse formato é usado principalmente quando os assignments de trans-
formação são triviais (como SELF := LEFT;).
Exemplo:
namesIdRecord assignId(namesRecord L) := TRANSFORM
 SELF := L; //more like-named fields across
 SELF := []; //clear all other fields
END;
projected1 := PROJECT(namesTable, assignId(LEFT));
projected2 := PROJECT(namesTable, TRANSFORM(namesIdRecord,
 SELF := LEFT;
 SELF := []));
//projected1 and projected2 do the same thing
TRANSFORMs abreviado em linha
Este formato de TRANSFORM é uma versão abreviada de TRANSFORMs em linha. Neste formato,
TRANSFORM(LEFT)
é diretamente equivalente a
TRANSFORM(RECORDOF(LEFT), SELF := LEFT)
Exemplo:
namesIdRecord assignId(namesRecord L) := TRANSFORM
 SELF := L; //move like-named fields across
END;
projected1 := PROJECT(namesTable, assignId(LEFT));
projected2 := PROJECT(namesTable, TRANSFORM(namesIdRecord,
 SELF := LEFT));
projected3 := PROJECT(namesTable, TRANSFORM(LEFT));
//projected1, projected2, and projected3 all do the same thing
Ver também: RECORD Structure, RECORDOF, TYPEOF, JOIN, PROJECT, ITERATE, ROLLUP, NORMALIZE,
DENORMALIZE, FETCH, PARSE, ROW
© 2020 HPCC Systems. All rights reserved
41
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
PROJECT
PROJECT( recordset, transform [, PREFETCH [ (lookahead [, PARALLEL]) ] ] [, KEYED ] [, LOCAL ] [,
UNORDERED | ORDERED( bool ) ] [, STABLE | UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGO-
RITHM( name ) ] )
PROJECT( recordset, record [, PREFETCH [ (lookahead [, PARALLEL]) ] ] [, KEYED ] [, LOCAL ] [, UN-
ORDERED | ORDERED( bool ) ] [, STABLE | UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM(
name ) ] )
recordset O conjunto de registros para processamento. Esse pode ser um DATASET em linha de registro
único.
transform A função TRANSFORM a ser acionada para cada registro no recordset.
PREFETCH Opcional. Permite que leituras de índice dentro do transfom sejam tão eficientes quanto JOINs
com chave. Válido apenas para consultas ECL no Roxie.
lookahead Opcional. Especifica o número de leituras antecipadas. Se omitido, o padrão é o valor da tag
_PrefetchProjectPreload na consulta enviada. Se for omitido, o valor de defaultPrefetchProject-
Preload especificado no arquivo RoxieTopology será usado quando o Roxie foi implantado. Se
for omitido, 10 será usado por padrão.
PARALLEL Opcional. Especifica que a consulta avançada é feita em um thread separado, em paralelo com
a execução da consulta.
KEYED Opcional. Especifica que a atividade faz parte de uma operação de leitura de índice, a qual
permite que o otimizador gere o código ideal para a operação.
LOCAL Opcional. Especifica que a operação é realizada em cada nó de supercomputador de forma in-
dependente, sem exigir interação com todos os outros nós para obter dados; a operação mantém
a distribuição de qualquer operação DISTRIBUTE anterior.
record A estrutura RECORD do resultado estrutura para uso em cada registro no recordset.
UNORDERED Opcional. Especifica que a ordem do registro de resultado não é importante.
ORDERED Especifica a importância da ordem do registro de resultado.
bool Quando for “False” (Falso), especifica que a ordem do registro de resultado não é importante.
Quando for “True’ (Verdadeiro), especifica a ordem padrão do registro de resultado.
STABLE Opcional. Especifica que a ordem do registro de entrada é importante.
UNSTABLE Opcional. Especifica que a ordem do registro de entrada não é importante.
PARALLEL Opcional. Tenta avaliar essa atividade em paralelo.
numthreads Opcional. Tenta avaliar essa atividade usando os numthreads threads
ALGORITHM Opcional. Substitui o algoritmo usado para essa atividade.
name O algoritmo a ser usado para essa atividade. Precisa fazer parte da lista de algoritmos com-
patíveis com as opções STABLE e UNSTABLE da função SORT.
Return: PROJECT retorna um conjunto de registros.
A função PROJECT processa todos os registros no recordset , realizam a função transform em cada registro por vez.
A forma 1 PROJECT(recordset,record) é basicamente um sinônimo abreviado para:
PROJECT(recordset,TRANSFORM(record,SELF := LEFT)).
simplificando a transferência de dados de uma estrutura para outra sem um TRANSFORM, contanto que todos os
campos na estrutura de registro de resultado estejam presentes no recordset de entrada.
© 2020 HPCC Systems. All rights reserved
42
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Requisitos da Função TRANSFORM - PROJECT
A função transform precisa usar no mínimo um parâmetro: um registro LEFT de mesmo formato que o recordset.
Opcionalmente, ele pode usar um segundo parâmetro: um COUNTER inteiro que especifique o número de vezes que
a função transform foi acionada para o recordset , ou outro grupo atual no recordset (consulte a função GROUP). O
segundo form de parâmetro é útil para adicionar números de sequência. O formato do conjunto de registro resultante
não precisa ser o mesmo do da entrada.
Exemplo:
//form one example **********************************
Ages := RECORD
 STRING15 per_first_name;
 STRING25 per_last_name;
 INTEGER8 Age;
END;
TodaysYear := 2001;
Ages CalcAges(person l) := TRANSFORM
 SELF.Age := TodaysYear - l.birthdate[1..4];
 SELF := l;
END;
AgedRecs := PROJECT(person, CalcAges(LEFT));
//COUNTER example **********************************
SequencedAges := RECORD
 Ages;
 INTEGER8 Sequence := 0;
END;
SequencedAges AddSequence(Ages l, INTEGER c) :=
 TRANSFORM
 SELF.Sequence := c;
 SELF := l;
END;
SequencedAgedRecs := PROJECT(AgedRecs,
 AddSequence(LEFT,COUNTER));
//form two example **********************************
NewRec := RECORD
 STRING15 firstname;
 STRING25 lastname;
 STRING15 middlename;
END;
NewRecs := PROJECT(People,NewRec);
//equivalent to:
//NewRecs := PROJECT(People,TRANSFORM(NewRec,SELF :=
 LEFT));
//LOCAL example **********************************
MyRec := RECORD
 STRING1 Value1;
 STRING1 Value2;
END;
SomeFile := DATASET([{'C','G'},{'C','C'},{'A','X'},
 {'B','G'},{'A','B'}],MyRec);
MyOutRec := RECORD
 SomeFile.Value1;
 SomeFile.Value2;
© 2020 HPCC Systems. All rights reserved
43
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
 STRING6 CatValues;
END;
DistFile := DISTRIBUTE(SomeFile,HASH32(Value1,Value2));
MyOutRec CatThem(SomeFile L, INTEGER C) := TRANSFORM
 SELF.CatValues := L.Value1 + L.Value2 + '-' +
 (Std.System.Thorlib.Node()+1) + '-' + (STRING)C;
 SELF := L;
END;
CatRecs := PROJECT(DistFile,CatThem(LEFT,COUNTER),LOCAL);
OUTPUT(CatRecs);
/* CatRecs result set is:
Rec# Value1 Value2 CatValues
1 C C CC-1-1
2 B G BG-2-1
3 A X AX-2-2
4 A B AB-3-1
5 C G CG-3-2
*/
Ver também: Estrutura TRANSFORM, Estrutura RECORD, ROW, DATASET
PROJECT - Módulo
PROJECT( module, interface [, OPT | attributelist ] )
module A estrutura MODULE que contém definições de atributo cujos valores passam como a interface.
interface A estrutura INTERFACE para passar.
OPT Opcional. Suprime a mensagem de erro que é gerada quando um atributo definido na interface
não é definido também no módulo.
attributelist Opcional. Uma lista de atributos específicos delimitada por vírgula no módulo para fornecer à
interface. Isso permite a implementação de uma lista especificada de atributos, algo que é útil se
você quiser um controle mais rígido ou se os tipos de parâmetros não corresponderem.
Return: PROJECT retorna um MODULE compatível com a interface.
A função PROJECT passa os atributos de um módulo na forma de interface para uma função definida para aceitar
parâmetrosestruturados como a interface especificada. Isso permite que você crie um módulo para uma interface
com os valores fornecidos por outra interface. Os atributos no módulo precisam ser compatíveis com os atributos na
interface (do mesmo tipo e mesmos parâmetros, se usar algum parâmetro).
Exemplo:
PROJECT(x,y)
/*is broadly equivalent to
MODULE(y)
 SomeAttributeInY := x.someAttributeInY
 //... repeated for all attributes in Y ...
END;
*/
myService(myInterface myArgs) := FUNCTION
 childArgs := MODULE(PROJECT(myArgs,Iface,isDead,did,ssn,address))
 BOOLEAN isFCRA := myArgs.isFCRA OR myArgs.fakeFCRA
 END;
 RETURN childService(childArgs);
© 2020 HPCC Systems. All rights reserved
44
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
 END;
// you could directly pass PROJECT as a module parameter
// to an attribute:
myService(myInterface myArgs) := childService(PROJECT(myArgs, childInterface));
Ver também: Estrutura MODULE, Estrutura INTERFACE, Estrutura FUNCTION, STORED
© 2020 HPCC Systems. All rights reserved
45
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Exemplo funcional de PROJECT
PROJECT
Abra BWR_Training_Examples.DEDUP_ALL_Example em uma janela ECL e envie esta consulta:
MyRec := RECORD
 STRING1 Value1;
 STRING1 Value2;
END;
SomeFile := DATASET([{'C','G'},
 {'C','C'},
 {'A','X'},
 {'B','G'},
 {'A','B'}],MyRec);
MyOutRec := RECORD
 SomeFile.Value1;
 SomeFile.Value2;
 STRING4 CatValues;
END;
MyOutRec CatThem(SomeFile L, INTEGER C) := TRANSFORM
 SELF.CatValues := L.Value1 + L.Value2 + '-' + (STRING)C;
 SELF := L;
END;
CatRecs := PROJECT(SomeFile,CatThem(LEFT,COUNTER));
OUTPUT(CatRecs);
/* CatRecs result set is:
 Rec# Value1 Value2 CatValues
 1 C G CG-1
 2 C C CC-2
 3 A X AX-3
 4 B G BG-4
 5 A B AB-5
*/
© 2020 HPCC Systems. All rights reserved
46
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Diagrama de exemplo funcional do PROJECT
© 2020 HPCC Systems. All rights reserved
47
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
ITERATE
ITERATE(recordset, transform [, LOCAL ] [, UNORDERED | ORDERED( bool ) ] [, STABLE | UNSTABLE ]
[, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
recordset O conjunto de registros para processamento.
transform A função TRANSFORM a ser acionada para cada registro no recordset.
UNORDERED Opcional. Especifica que a ordem do registro de resultado não é importante.
ORDERED Especifica a importância da ordem do registro de resultado.
bool Quando for “False” (Falso), especifica que a ordem do registro de resultado não é importante.
Quando for “True’ (Verdadeiro), especifica a ordem padrão do registro de resultado.
STABLE Opcional. Especifica que a ordem do registro de entrada é importante.
UNSTABLE Opcional. Especifica que a ordem do registro de entrada não é importante.
PARALLEL Opcional. Tenta avaliar essa atividade em paralelo.
numthreads Opcional. Tenta avaliar essa atividade usando os numthreads threads
ALGORITHM Opcional. Substitui o algoritmo usado para essa atividade.
name O algoritmo a ser usado para essa atividade. Precisa fazer parte da lista de algoritmos com-
patíveis com as opções STABLE e UNSTABLE da função SORT.
LOCAL Opcional. Especifica que a operação é realizada em cada nó de supercomputador de forma independente,
sem exigir interação com todos os outros nós para obter dados; a operação mantém a distribuição de qualquer operação
DISTRIBUTE anterior.
Return: ITERATE retorna um conjunto de registros.
A função ITERATE processa através de todos os registros no recordset um par de registros por vez, executando a
função transform em cada par sucessivamente. O primeiro registro no recordset é especificado para transform como o
primeiro registro RIGHT, emparelhado com um registro LEFT cujos campos estão todos em branco ou definidos para
zero. Cada registro resultante de transform se torna o registro LEFT do próximo par.
Requerimentos da Função TRANSFORM - ITERATE
A função transform deve adotar pelo menos dois parâmetros: Registros LEFT e RIGHT que precisam estar no mesmo
formato que o recordset resultante. Pode ser especificado um terceiro parâmetro opcional: um COUNTER de número
inteiro para especificar o número de vezes que transform foi acionado para o recordset ou para o grupo atual no
recordset (consulte a função GROUP ).
Exemplo:
ResType := RECORD
 INTEGER1 Val;
 INTEGER1 Rtot;
END;
Records := DATASET([{1,0},{2,0},{3,0},{4,0}],ResType);
/* these are the recs going in: 
Val Rtot 
 1 0
 2 0
 3 0
 4 0 */
© 2020 HPCC Systems. All rights reserved
48
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
ResType T(ResType L, ResType R) := TRANSFORM
 SELF.Rtot := L.Rtot + R.Val;
 SELF := R;
END;
MySet1 := ITERATE(Records,T(LEFT,RIGHT));
/* these are the recs coming out: 
Val Rtot
 1 1
 2 3
 3 6
 4 10 */
//The following code outputs a running balance:
Run_bal := RECORD
 Trades.trd_bal;
 INTEGER8 Balance := 0;
END;
TradesBal := TABLE(Trades,Run_Bal);
Run_Bal DoRoll(Run_bal L, Run_bal R) := TRANSFORM
 SELF.Balance := L.Balance + IF(validmoney(R.trd_bal),R.trd_bal,0);
 SELF := R;
END;
MySet2 := ITERATE(TradesBal,DoRoll(LEFT,RIGHT));
See Also: Estrutura TRANSFORM, Estrutura RECORD, ROLLUP
© 2020 HPCC Systems. All rights reserved
49
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Exemplo funcional ITERATE
ITERATE
Abra BWR_Training_Examples.ITERATE_Example em uma janela ECL e envie esta consulta:
MyRec := RECORD
 INTEGER2 Value1;
 INTEGER2 Value2;
END;
SomeFile := DATASET([{10,0},
 {20,0},
 {30,0},
 {40,0},
 {50,0}],MyRec);
MyRec AddThem(MyRec L, MyRec R) := TRANSFORM
 SELF.Value2 := L.Value2 + R.Value1;
 SELF := R;
END;
AddedRecs := ITERATE(SomeFile,AddThem(LEFT,RIGHT));
output(AddedRecs);
/* Processes as:
 LEFT.Value2 RIGHT.Value1
 0 (0) 1 (10) - 0 + 10 = 10
 1 (10) 2 (20) - 10 + 20 = 30
 2 (30) 3 (30) - 30 + 30 = 60
 3 (60) 4 (40) - 60 + 40 = 100
 4 (100) 5 (50) - 100 + 50 = 150
AddedRecs result set is:
 Rec# Value1 Value2
 1 10 10
 2 20 30
 3 30 60
 4 40 100
 5 50 150
*/
© 2020 HPCC Systems. All rights reserved
50
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Diagrama de Exemplo Funcional ITERATE
© 2020 HPCC Systems. All rights reserved
51
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
PERSIST
attribute := expression : PERSIST( filename [, cluster ] [, CLUSTER(target)] [, EXPIRE(days )] [, REFRESH(flag
)] [, SINGLE | MULTIPLE[(count)]] ) ;
attribute O nome do atributo.
expression A definição do atributo. Isso normalmente define um recordset (mas pode ser qualquer ex-
pressão).
filename Uma constante de string que especifica o nome de armazenamento do resultado de expressão.
Consulte Escopo e nomes de arquivo lógicos..
cluster Opcional. Uma constante de string que especifica o nome do cluster Thor no qual o atributo é re-
compilado se/quando necessário. Isso possibilita usar atributos persistentes em clusters menores,
mas compilá-los em maiores, tornando a utilização de recursos mais eficiente. Se omitido, o
atributo é recompilado no cluster em execução atualmente.
CLUSTER Opcional. Especifica a gravação do nome de arquivo para a lista especificada de clusters de des-
tino . Se omitido, o nome de arquivo é gravado no cluster no qual a função PERSIST é executada
(como especificadopelo parâmetro cluster ). O número de partes de arquivos físicos gravadas
em disco é sempre determinado pelo número de nós no cluster no qual a função PERSIST é
executada, independentemente do número de nós no(s) destino(s).
target Uma lista de constantes de string delimitada por vírgulas que contém os nomes dos clusters
no qual o arquivo será gravado. Os nomes devem estar listados como aparecem na página de
Atividade do ECL Watch, ou como são retornados pela função Std.System.Thorlib.Group(); op-
cionalmente, podem apresentar colchetes contendo uma lista delimitada por vírgula dos números
dos nós (baseado em 1) e/ou dos intervalos (especificados com um traço, como p.ex., n-m) para
indicar o conjunto específico de nós para gravar.
EXPIRE Opcional. Especifica que o nome de arquivo é um arquivo temporário que pode ser removido
automaticamente após um número especificado de dias.
days Opcional. O número de dias em que o arquivo será automaticamente removido. Se omitido, por
padrão, a configuração PersistExpiryDefault será usada no Sasha.
REFRESH Opcional. Opção de controle quando o PERSIST é recompilado. Se omitido, o PERSIST recom-
pila caso 1) o arquivo subjacente não exista, ou 2) os dados tenham sido alterados ou 3) o código
tenha sido alterado.
flag Um valor booleano indicando se PERSIST deve ser recompilado ou não. Quando definido para
FALSE, o PERSIST recompila ONLY (APENAS) se o arquivo subjacente não existir. Se seu
layout PERSIST tiver sido alterado e você especificar REFRESH(FALSE), a incompatibilidade
ocasionaria a falha do job.
SINGLE Opcional. Especifica para manter um único PERSIST. O nome do arquivo de persistência é o
mesmo do nome da persistência.
MULTIPLE Opcional. Especifica para manter diferentes versões do PERSIST. O nome do arquivo de per-
sistência gerado é uma combinação do nome fornecido com sufixo de valor de 32 bits derivado
do ECL.
count Opcional. O número de versões de um PERSIST deve ser mantido. Se omitido, o padrão do
sistema será usado.
O serviço PERSIST armazena o resultado da expressão globalmente de forma a continuar permanentemente disponív-
el para uso (incluindo o resultado de qualquer operação DISTRIBUTE ou GROUP na expressão). Isso é especialmente
útil para atributos baseados em sequências de manipulação de dados dispendiosas e grandes. O atributo é recalculado
apenas quando o código ECL ou os dados subjacentes que foram usados para criá-lo sofrem alterações; caso contrário,
© 2020 HPCC Systems. All rights reserved
52
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
os dados de atributo são simplesmente retornados do arquivo nome armazenado em disco quando referido. Implicita-
mente, esse serviço faz com que o atributo seja avaliado em um escopo global em vez de escopo de função.
PERSIST pode ser combinado com a cláusula WHEN para que, embora o atributo possa ser usado mais de uma vez,
sua execução seja baseada na cláusula WHEN (ou o primeiro uso do atributo) e não baseada no número de vezes que
o atributo é usado na computação. Isso oferece um tipo recurso denominado "computação antecipada".
Exemplo:
 CountPeople := COUNT(Person) : PERSIST('PeopleCount');
 //Makes CountPeople available for use in all subsequent work units
 
 sPeople := SORT(Person,Person.per_first_name) :
 PERSIST('SortPerson'),WHEN(Daily);
 //Makes sPeople available for use in all subsequent work units
 
 s1 := SORT(Person,Person.per_first_name) :
 PERSIST('SortPerson1','OtherThor');
 //run the code on the OtherThor cluster
 s2 := SORT(Person,Person.per_first_name) :
 PERSIST('SortPerson2',
 'OtherThor',
 CLUSTER('AnotherThor'));
 //run the code on the OtherThor cluster
 // and write the file to the AnotherThor cluster
Ver também: STORED, WHEN, GLOBAL, CHECKPOINT
Estrutura SERVICE
servicename := SERVICE [ : defaultkeywords ]
prototype : keywordlist;
END;
servicename O nome do serviço fornecido pela estrutura SERVICE.
defaultkeywords Opcional. Uma lista delimitada por vírgula das palavras-chave padrão e seus valores compar-
tilhados por todos os protótipos no serviço externo.
prototype O nome ECL e o protótipo de uma função específica.
keywordlist Uma lista delimitada por vírgula das palavras-chave e seus valores que instruem o compilador
ECL como acessar o serviço externo.
A estrutura SERVICE possibilita a criação de serviços externos para ampliar os recursos do ECL no desempenho
de qualquer funcionalidade desejada. Estes serviços externos do sistema são implementados como funções exportadas
em .SO(Shared Object). Um serviço de sistema da ECL .SO pode conter um ou mais serviços e (possivelmente) uma
única rotina de inicialização de .SO.
Exemplo:
 email := SERVICE
 simpleSend( STRING address,
 STRING template,
 STRING subject) : LIBRARY='ecl2cw',
© 2020 HPCC Systems. All rights reserved
53
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
 INITFUNCTION='initEcl2Cw';
 END;
 MyAttr := COUNT(Trades): FAILURE(email.simpleSend('help@ln_risk.com',
 'FailTemplate',
 'COUNT failure'));
 //An example of a SERVICE function returning a structured record
 NameRecord := RECORD
 STRING5 title;
 STRING20 fname;
 STRING20 mname;
 STRING20 lname;
 STRING5 name_suffix;
 STRING3 name_score;
 END;
 
 LocalAddrCleanLib := SERVICE
 NameRecord dt(CONST STRING name, CONST STRING server = 'x')
 : c,entrypoint='aclCleanPerson73',pure;
 END;
 
 MyRecord := RECORD
 UNSIGNED id;
 STRING uncleanedName;
 NameRecord Name;
 END;
 x := DATASET('x', MyRecord, THOR);
 
 myRecord t(myRecord L) := TRANSFORM
 SELF.Name := LocalAddrCleanLib.dt(L.uncleanedName);
 SELF := L;
 END;
 y := PROJECT(x, t(LEFT));
 OUTPUT(y);
 //The following two examples define the same functions:
 TestServices1 := SERVICE
 member(CONST STRING src)
 : holertl,library='test',entrypoint='member',ctxmethod;
 takesContext1(CONST STRING src)
 : holertl,library='test',entrypoint='takesContext1',context;
 takesContext2()
 : holertl,library='test',entrypoint='takesContext2',context;
 STRING takesContext3()
 : holertl,library='test',entrypoint='takesContext3',context;
 END;
 
 //this form demonstrates the use of default keywords
 TestServices2 := SERVICE : holert,library='test'
 member(CONST STRING src) : entrypoint='member',ctxmethod;
 takesContext1(CONST STRING src) : entrypoint='takesContext1',context;
 takesContext2() : entrypoint='takesContext2',context;
 STRING takesContext3() : entrypoint='takesContext3',context;
 END;
Ver também: Implementação de Serviços Externos, CONST
© 2020 HPCC Systems. All rights reserved
54
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Node
STD.System.Thorlib.Node( )
Return: Node retorna um valor UNSIGNED INTEGER4.
A função Node retorna o número (baseado em zero) do nó da Refinaria de dados (Thor) ou do Motor de entrega
rápida de dados (Roxie).
Example:
A := STD.System.Thorlib.Node();
© 2020 HPCC Systems. All rights reserved
55
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Nodes
STD.System.Thorlib.Nodes( )
Return: Node retorna um valor UNSIGNED INTEGER4.
A função Nodes retorna o número de nós no cluster Thor (para hThor e Roxie, retorna sempre 1). Esse número é
o mesmo que a constante de tempo de compilação CLUSTERSIZE. A função Nodes é avaliada a cada vez que é
chamada. Portanto, a opção entre usar a função e a constante depende das circunstâncias.
Exemplo:
A := STD.System.Thorlib.Nodes();
© 2020 HPCC Systems. All rights reserved
56
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Exercício 4a
Especificação do exercício:
Crie uma definição de conjunto de registros que adicionenúmeros de identificação de registro exclusivos ao arquivo
Persons usando PROJECT. Use o serviço de workflow PERSIST para que os resultados não precisem ser recalculados
no uso subsequente.
Requisitos:
1. O arquivo de definição a ser criado para este exercício é: UID_Persons.
2. O nome PERSIST deve começar com ~CLASS, seguido pelas suas iniciais, seguidas por PERSIST::UID_Persons,
como neste exemplo:
~CLASS::XX::PERSIST::UID_Persons
Comparação do resultado
Abra uma janela do ECL Builder e execute uma SAÍDA simples da definição. Verifique se o campo de identificação
do registro é numerado sequencialmente.
© 2020 HPCC Systems. All rights reserved
57
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Transformações simples
Exercício 4b
Especificação do exercício:
Crie uma definição de conjunto de registros que adicione números de Record ID exclusivos ao arquivo Accounts
usando ITERATE. Use as funções ThorLib.Node e ThorLib.Nodes (consulte a Referência da Biblioteca de Serviços)
para criar os identificadores de registro exclusivos para que o ITERATE possa usar a opção LOCAL.
Use o serviço de workflow PERSIST para que os resultados não precisem ser recalculados no uso subsequente.
Requisitos:
O arquivo de definição a ser criado para este exercício é: UID_Accounts
O nome PERSIST deve começar com ~CLASS, seguido pelas suas iniciais, seguidas por PERSIST::UID_Accounts,
como neste exemplo:
~CLASS::XX::PERSIST::UID_Accounts
Comparação do resultado
Abra uma janela do ECL Builder e execute uma SAÍDA simples da definição. Como você está obtendo apenas 100
registros, todos serão do primeiro nó a responder à consulta. Verifique se o campo ID do registro está numerado
exclusivamente em incrementos que correspondem ao número de nós no ambiente (3).
© 2020 HPCC Systems. All rights reserved
58
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Padronização de dados
Padronização de dados
Neste capítulo, examinaremos o processo de limpeza e compressão de dados. Antes de prosseguir, vamos apresentar
uma função adicional de ECL que usaremos no próximo conjunto de exercícios:
© 2020 HPCC Systems. All rights reserved
59
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Padronização de dados
SIZEOF
SIZEOF(data [, MAX ] )
data O nome de um dataset, uma estrutura RECORD, o nome de um campo totalmente qualificado,
ou uma expressão de string constante.
MAX Especifica que os dados são de comprimento variável (que contêm datasets secundários) e que o
valor a ser retornado possui tamanho máximo.
Return: ROUNDUP retorna um único valor inteiro.
A função SIZEOF retorna o número total de bytes definido para armazenar a estrutura de dados ou campo especifi-
cados. data Estrutura ou Campo.
Exemplo:
MyRec := RECORD
INTEGER1 F1;
INTEGER5 F2;
STRING1 F3;
STRING10 F4;
QSTRING12 F5;
VARSTRING12 F6;
END;
MyData :=
 DATASET([{1,33333333333,'A','A','A',V'A'}],MyRec);
SIZEOF(MyRec); //result is 39
SIZEOF(MyData.F1); //result is 1
SIZEOF(MyData.F2); //result is 5
SIZEOF(MyData.F3); //result is 1
SIZEOF(MyData.F4); //result is 10
SIZEOF(MyData.F5); //result is 9 -12 chars stored in 9
 bytes
SIZEOF(MyData.F6); //result is 13 -12 chars plus null
 terminator
Layout_People := RECORD
STRING15 first_name;
STRING15 middle_name;
STRING25 last_name;
STRING2 suffix;
STRING42 street;
STRING20 city;
STRING2 st;
STRING5 zip;
STRING1 sex;
STRING3 age;
STRING8 dob;
BOOLEAN age_flag;
UNSIGNED8 __filepos { virtual(fileposition)};
END;
File_People := DATASET('ecl_training::People', Layout_People,
 FLAT);
SIZEOF(File_People); //result is 147
SIZEOF(File_People.street); //result is 42
SIZEOF('abc' + '123'); //result is 6
SIZEOF(person.per_cid); //result is 9 - Person.per_cid is
 DATA9
Ver também: LENGTH
© 2020 HPCC Systems. All rights reserved
60
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Padronização de dados
© 2020 HPCC Systems. All rights reserved
61
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Padronização de dados
Exercício 5a
Especificação do exercício:
Primeiro, determine o intervalo de valores de dados no arquivo de definição UID_Persons que você criou anterior-
mente e use a função TABLE para criar um Recordset com os campos de dados em UID_Persons o mais compactados
possível. Use bibliotecas de strings built-in para converter todos os campos de nome pertinentes em maiúsculos.
Use o serviço de workflow PERSIST na definição TABLE para que os resultados não precisem ser recalculados no
uso subsequente.
Requisitos:
1. O arquivo de definição a ser criado para o dataset Persons padronizado é: STD_Persons.
2. O nome do arquivo PERSIST usado com a definição TABLE deve começar com ~CLASS, seguido pelas suas
iniciais, seguidas por PERSIST::STD_Persons, como neste exemplo:
 ~CLASS::XX::PERSIST::STD_Persons
Melhores práticas
1. Crie uma estrutura modular em STD_Persons e duas definições de exportação dentro do módulo que exportam os
novos RECORD (Layout) e TABLE (File) compactados.
2. Veja as possibilidades de armazenamento dos campos de data e zip.
3. Examine as bibliotecas de strings built-in e encontrará uma função de string apropriada usada para converter qualquer
string em maiúsculas. Use esta função no layout RECORD e verifique se todos os campos de nome apropriados no
dataset Persons são processados.
Comparação do resultado
Use uma janela do Builder para executar uma consulta SIZEOF simples e verifique se o resultado é 133 e, em segui-
da, execute uma consulta simples e verifique se o resultado parece razoável (todos os nomes convertidos em dados
numéricos compactados em maiúsculas parecem bons).
Exemplo:
IMPORT TrainingYourName;
SIZEOF(TrainingYourName.STD_Persons.Layout);
TrainingYourName.STD_Persons.File;
© 2020 HPCC Systems. All rights reserved
62
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Padronização de dados
Exercício 5b
Especificação do exercício:
Primeiro, determine o intervalo de valores de dados na definição UID_Account que você criou anteriormente e use
a função TABLE para criar um atributo Recordset com os campos de dados em UID_Account o mais compactado
possível. Use o serviço de workflow PERSIST na definição TABLE para que os resultados não precisem ser recalcu-
lados no uso subsequente.
Requisitos:
1. O arquivo de definição a ser criado para este exercício é: STD_Accounts
2. O nome do arquivo PERSIST usado com a definição TABLE deve começar com ~CLASS, seguido pelas suas
iniciais, seguidas por PERSIST::STD_Accounts, como neste exemplo:
 ~CLASS::XX::PERSIST::STD_Accounts
Melhores práticas
1. Crie uma estrutura MODULE e duas definições EXPORT dentro do módulo que exportam o novo RECORD (Lay-
out) e TABLE(File).
2. Veja as possibilidades de armazenamento de datas.
Comparação do resultado
Use uma janela do Builder para executar uma consulta SIZEOF simples e verifique se o resultado é 69, depois execute
uma consulta OUTPUT simples e verifique se o resultado parece razoável.
Exemplo:
IMPORT TrainingYourName;
SIZEOF(TrainingYourName.STD_Accounts.Layout);
TrainingYourName.STD_Accounts.File;
© 2020 HPCC Systems. All rights reserved
63
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Criando tabelas lookup
Criando tabelas lookup
© 2020 HPCC Systems. All rights reserved
64
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Criando tabelas lookup
ROLLUP
ROLLUP(recordset, condition, transform [, LOCAL] [, UNORDERED | ORDERED( bool ) ] [, STABLE |
UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
ROLLUP(recordset, transform, fieldlist [, LOCAL] [, UNORDERED | ORDERED( bool ) ] [, STABLE |
UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
ROLLUP(recordset, GROUP, transform [, UNORDERED | ORDERED( bool ) ] [, STABLE | UNSTABLE ] [,
PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
recordset O recordset a serprocessado, normalmente classificado na mesma ordem em que a condição ou
fieldlist será testada.
condition Uma expressão que define registros “duplicados”. As palavras-chave LEFT e RIGHT podem ser
usadas como qualificadores de dataset nos campos do recordset.
transform A função TRANSFORM é usada para acionar cada par de registros duplicados encontrado.
LOCAL Opcional. Especifica que a operação é realizada em cada nó de supercomputador de forma inde-
pendente, sem exigir interação com todos os outros nós para obter dados; a operação mantém a
distribuição de qualquer operação DISTRIBUTE anterior.
fieldlist Uma lista delimitada por vírgula de expressões ou campos no conjunto de registros que define
os registros “duplicados”. As palavras-chave WHOLE RECORD (ou apenas RECORD) devem
ser usadas para indicar todos os campos nessa estrutura, e/ou você pode usar a palavra-chave
EXCEPT para listar os campos a serem excluídos.
GROUP Especifica que o recordset é GROUPed e a operação ROLLUP irá gerar um único registro de
resultado para cada grupo. Se não for este o caso, ocorrerá um erro.
UNORDERED Opcional. Especifica que a ordem do registro de resultado não é importante.
ORDERED Especifica a importância da ordem do registro de resultado.
bool Quando for “False” (Falso), especifica que a ordem do registro de resultado não é importante.
Quando for “True’ (Verdadeiro), especifica a ordem padrão do registro de resultado.
STABLE Opcional. Especifica que a ordem do registro de entrada é importante.
UNSTABLE Opcional. Especifica que a ordem do registro de entrada não é importante.
PARALLEL Opcional. Tenta avaliar essa atividade em paralelo.
numthreads Opcional. Tenta avaliar essa atividade usando os numthreads threads
ALGORITHM Opcional. Substitui o algoritmo usado para essa atividade.
name O algoritmo a ser usado para essa atividade. Precisa fazer parte da lista de algoritmos compatíveis
com as opções STABLE e UNSTABLE da função SORT.
Return: ROLLUP retorna um conjunto de registros.
A função ROLLUP é semelhante à função DEDUP , porém possui o acionamento da função transform para processar
cada par de registro duplicado. Isso permite recuperar informações valiosas do registro “duplicado” antes que ele seja
descartado. Dependendo de como você codifica o transform , ROLLUP pode manter o registro LEFT ou RIGHT , ou
qualquer mistura de dados de ambos.
A primeira forma de ROLLUP testa uma condição usando valores dos registros que seriam especificados como LEFT e
RIGHT para transform. Os registros são combinados se a condição for true (verdadeira). A segunda forma de ROLLUP
compara valores de registros adjacentes no recordset de entrada, combinando-os caso sejam iguais. Estas duas for-
mas adotarão um comportamento diferente se transform modificar alguns dos campos usados na condição de corre-
spondência (veja os exemplos abaixo).
© 2020 HPCC Systems. All rights reserved
65
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Criando tabelas lookup
Para o primeiro par de registros candidatos, o registro LEFT especificado para “transform” corresponde ao primeiro
registro do par, e o registro RIGHT o segundo. Para as correspondências subsequentes de mesmo valor, o registro
LEFT especificado corresponde ao registro de resultado do acionamento anterior do transform , e o registro RIGHT
o próximo registro no recordset, como descrito neste exemplo:
ds := DATASET([{1,10},{1,20},{1,30},{3,40},{4,50}], 
 {UNSIGNED r, UNSIGNED n});
d t(ds L, ds R) := TRANSFORM
 SELF.r := L.r + R.r;
 SELF.n := L.n + R.n;
END;
ROLLUP(ds, t(LEFT, RIGHT), r);
/* results in:
 3 60
 3 40
 4 50
*/
ROLLUP(ds, LEFT.r = RIGHT.r,t(LEFT, RIGHT));
/* results in:
 2 30
 1 30
 3 40
 4 50
 the third record is not combined because the transform modified the value.
*/
Requerimentos da Função TRANSFORM - ROLLUP
Para as formas 1 e 2 de ROLLUP, a função transform deve adotar pelo menos dois parâmetros: um registro LEFT e
um registro RIGHT , onde ambos devem estar no mesmo formato que o recordset. O formato do conjunto de registros
resultante também deve ser o mesmo que as entradas.
Para a forms 3 de ROLLUP, a função transform deve adotar pelo menos dois parâmetros: um registro LEFT
que deve estar no mesmo formato que o recordset, e um ROWS(LEFT) cujo formato deve ser um parâmetro
DATASET(RECORDOF(recordset)) . O formato do conjunto de registros resultante deve ser diferente das entradas.
Forma 1 do ROLLUP
A forma 1 é processada através de todos os registros no recordset , desempenhando a função transform apenas nos pares
de registros adjacentes onde a condition de correspondência é atingida (indicando registros duplicados) e passando
direto por todos os outros registros até o resultado.
Exemplo:
//a crosstab table of last names and the number of times they occur
MyRec := RECORD
 Person.per_last_name;
 INTEGER4 PersonCount := 1;
END;
LnameTable := TABLE(Person,MyRec); //create dataset to work with
SortedTable := SORT(LnameTable,per_las_name); //sort it first
MyRec Xform(MyRec L,MyRec R) := TRANSFORM
 SELF.PersonCount := L.PersonCount + 1;
 SELF := L; //keeping the L rec makes it KEEP(1),LEFT
// SELF := R; //keeping the R rec would make it KEEP(1),RIGHT
END;
XtabOut := ROLLUP(SortedTable,
 LEFT.per_last_name=RIGHT.per_last_name,
 Xform(LEFT,RIGHT));
© 2020 HPCC Systems. All rights reserved
66
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Criando tabelas lookup
Forma 2 do ROLLUP
A forma 2 é processada através de todos os registros no recordset , desempenhando a função transform apenas nos
pares de registros adjacentes onde todas as expressões na fieldlist são correspondidas (indicando registros duplicados)
e passando por todos os outros registros até o resultado. Esta forma permite usar o mesmo tipo de lógica de exclusão
de campo EXCEPT disponível para DEDUP.
Exemplo:
rec := {STRING1 str1,STRING1 str2,STRING1 str3};
ds := DATASET([{'a', 'b', 'c'},{'a', 'b', 'c'},
 {'a', 'c', 'c'},{'a', 'c', 'd'}], rec);
rec tr(rec L, rec R) := TRANSFORM
 SELF := L;
END;
Cat(STRING1 L, STRING1 R) := L + R;
r1 := ROLLUP(ds, tr(LEFT, RIGHT), str1, str2);
 //equivalent to LEFT.str1 = RIGHT.str1 AND
 // LEFT.str2 = RIGHT.str2
r2 := ROLLUP(ds, tr(LEFT, RIGHT), WHOLE RECORD, EXCEPT str3);
 //equivalent to LEFT.str1 = RIGHT.str1 AND
 // LEFT.str2 = RIGHT.str2
r3 := ROLLUP(ds, tr(LEFT, RIGHT), RECORD, EXCEPT str3); 
 //equivalent to LEFT.str1 = RIGHT.str1 AND
 // LEFT.str2 = RIGHT.str2
r4 := ROLLUP(ds, tr(LEFT, RIGHT), RECORD, EXCEPT str2,str3);
 //equivalent to LEFT.str1 = RIGHT.str1
r5 := ROLLUP(ds, tr(LEFT, RIGHT), RECORD);
 //equivalent to LEFT.str1 = RIGHT.str1 AND
 // LEFT.str2 = RIGHT.str2 AND
 // LEFT.str3 = RIGHT.str3
r6 := ROLLUP(ds, tr(LEFT, RIGHT), str1 + str2);
 //equivalent to LEFT.str1+LEFT.str2 = RIGHT.str1+RIGHT.str2
r7 := ROLLUP(ds, tr(LEFT, RIGHT), Cat(str1,str2));
 //equivalent to Cat(LEFT.str1,LEFT.str2) =
 // Cat(RIGHT.str1,RIGHT.str2 )
Forma 3 do ROLLUP
A forma 3 é uma forma especial de ROLLUP onde o segundo parâmetro especificado para transform é um GROUP e
o primeiro parâmetro é o primeiro registro nesse GROUP. Ela é processada através de todos os grupos no recordset,
gerando um registro de resultado para cada grupo. Funções agregadas podem ser usadas dentro de transform (tais
como TOPN ou CHOOSEN) no segundo parâmetro. O conjunto de registro de resultado não é agrupado. Esta forma
é implicitamente LOCAL devido ao agrupamento.
Exemplo:
inrec := RECORD
 UNSIGNED6 did;
END;
outrec := RECORD(inrec)
 STRING20 name;
 UNSIGNED score;
END;
nameRec := RECORD
 STRING20 name;
END;
finalRec := RECORD(inrec)
© 2020 HPCC Systems. All rights reserved
67
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Criando tabelas lookup
 DATASET(nameRec) names;
 STRING20 secondName;
END;
ds := DATASET([1,2,3,4,5,6], inrec);
dsg := GROUP(ds, ROW);
i1 := DATASET([ {1, 'Kevin', 10},{2, 'Richard', 5},
 {5,'Nigel', 2},
 {0, '', 0}], outrec);
i2 := DATASET([ {1, 'Kevin Halligan', 12},
 {2, 'Richard Charles', 15},
 {3, 'Blake Smith', 20},
 {5,'Nigel Hicks', 100},
 {0, '', 0}], outrec);
i3 := DATASET([ {1, 'Halligan', 8},
 {2, 'Richard', 8},
 {6, 'Pete', 4},
 {6, 'Peter', 8},
 {6, 'Petie', 1},
 {0, '', 0}], outrec);
j1 := JOIN( dsg,
 i1,
 LEFT.did = RIGHT.did,
 TRANSFORM(outrec, SELF := LEFT; SELF := RIGHT),
 LEFT OUTER, MANY LOOKUP);
j2 := JOIN( dsg,
 i2,
 LEFT.did = RIGHT.did,
 TRANSFORM(outrec, SELF := LEFT; SELF := RIGHT),
 LEFT OUTER,
 MANY LOOKUP);
j3 := JOIN( dsg,
 i3,
 LEFT.did = RIGHT.did,
 TRANSFORM(outrec, SELF := LEFT; SELF := RIGHT),
 LEFT OUTER,
 MANY LOOKUP);
combined := REGROUP(j1, j2, j3);
finalRec doRollup(outRec l, DATASET(outRec) allRows) :=
 TRANSFORM
 SELF.did := l.did;
 SELF.names := PROJECT(allRows(score != 0),
 TRANSFORM(nameRec, SELF := LEFT));
 SELF.secondName := allRows(score != 0)[2].name;
END;
results := ROLLUP(combined, GROUP, doRollup(LEFT,ROWS(LEFT)));
Ver também: Estrutura TRANSFORM, Estrutura RECORD, DEDUP, EXCEPT, GROUP
© 2020 HPCC Systems. All rights reserved
68
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Criando tabelas lookup
Exemplo de ROLLUP funcional
ROLLUP
Abra BWR_Training_Examples.ROLLUP_Example em uma janela ECL e envie esta consulta:
MyRec := RECORD
 STRING1 Value1;
 STRING1 Value2;
 UNSIGNED1 Value3;
END;
SomeFile := DATASET([{'C','G',1},
 {'C','C',2},
 {'A','X',3},
 {'B','G',4},
 {'A','B',5}],MyRec);
SortedTable := SORT(SomeFile,Value1);
OUTPUT(SortedTable);
RECORDOF(SomeFile) RollThem(SomeFile L, SomeFile R) := TRANSFORM
 SELF.Value3 := IF(L.Value3 < R.Value3,L.Value3,R.Value3);
 SELF.Value2 := IF(L.Value2 < R.Value2,L.Value2,R.Value2);
 SELF := L;
END;
RolledUpRecs := ROLLUP(SortedTable,
 LEFT.Value1 = RIGHT.Value1,
 RollThem(LEFT,RIGHT));
OUTPUT(RolledUpRecs );
 
/*
Processes as:
 LEFT vs. RIGHT
 1 (AX3) 2 (AB5) - match, run transform, output AB3
 1 (AB3) 3 (BG4) - no match, output BG4
 3 (BG4) 4 (CX1) - no match 
 4 (CX1) 5 (CC2) - match, run transform, output CC1
Result set is:
 Rec# Value1 Value2 Value3
 1 A B 3
 2 B G 4
 2 C C 1
*/
© 2020 HPCC Systems. All rights reserved
69
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Criando tabelas lookup
Diagrama de Exemplo Funcional ROLLUP
© 2020 HPCC Systems. All rights reserved
70
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Criando tabelas lookup
Exercício 6a
Especificação do exercício:
Crie uma BWR que usa ROLLUP para criar um novo arquivo de todos os valores exclusivos de City, State e ZIP do
recordset STD_Persons. Verifique se cada registro no arquivo OUTPUT final possui um identificador exclusivo.
Use os identificadores exclusivos existentes em STD_Persons para a nova tabela, garantindo que o identificador uti-
lizado seja o de menor valor para esse conjunto exclusivo de valores.
Requisitos:
1. O nome do arquivo de definição a ser criado para este exercício é: BWR_Rollup_CSZ.
2. O nome do arquivo OUTPUT deve começar com ~CLASS, , seguido pelas suas iniciais, seguidas por
OUT::LookupCSZ, como neste exemplo:
 ~CLASS::XX::OUT::LookupCSZ
Comparação do resultado
Use uma janela do Builder para executar a consulta e procure na lista de arquivos lógicos do ECL Watch o arquivo
recém-gerado. Verifique se o tamanho do arquivo é de cerca de 600.387 e se há 20.703 registros.
Exercício 6b
Especificação do exercício:
Defina a estrutura RECORD e a definição de DATASET para a tabela LookupCSZ que você acabou de criar no Exer-
cício 6a. Coloque a definição RECORD em uma estrutura MODULE, nomeando o Layout de definição na estrutura
MODULE. Coloque a definição DATASET na mesma estrutura MODULE, nomeando o arquivo de definição dentro
da estrutura.
Requisitos:
1. O nome da definição do arquivo EXPORT a ser criado para este exercício é: File_LookupCSZ
Comparação do resultado
Use uma janela do Builder para executar uma saída simples e verifique se o resultado parece razoável.
© 2020 HPCC Systems. All rights reserved
71
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
Juntando arquivos
© 2020 HPCC Systems. All rights reserved
72
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
JOIN
JOIN(leftrecset, rightrecset, joincondition [, transform] [, jointype] [, joinflags] )
JOIN(setofdatasets, joincondition, transform, SORTED( fields) [, jointype] )
leftrecset O conjunto esquerdo dos registros para processamento.
rightrecset O conjunto direito dos registros para processamento. Esse pode ser um INDEX.
joincondition Uma expressão que especifica como combinar registros em leftrecset e rightrecset ou setof-
datasets (consulte as discussões de Lógica de combinação abaixo). Na expressão, a palavra-
chave LEFT é o qualificador de dataset para os campos no leftrecset e a palavra-chave RIGHT
é o qualificador do dataset para os campos no rightrecset.
transform Opcional. A função TRANSFORM para acionar cada par de registros para processamento. Se
omitida, JOIN retorna todos os campos de ambos leftrecset e rightrecset com o segundo de
qualquer campo de nome em duplicidade removido.
jointype Opcional. Se omitida, uma operação de junção interna; caso contrário, um dos tipos listados na
seção Tipos de JOIN abaixo.
joinflags Opcional. Qualquer opção (consulte a seção JOIN Options [OPÇÕES DE JOIN] abaixo) para
especificar exatamente como a operação JOIN é executada.
setofdatasets O SET de conjuntos de registro para processamento ([idx1,idx2,idx3]), normalmente INDEXes
(ÍNDiCES), em que todos precisam ter o mesmo formato.
SORTED Especifica a ordem de classificação de registros no setofdatasets de entrada, além da ordem de
classificação de resultado no conjunto de resultados.
fields Uma lista delimitada por vírgulas dos campos no setofdatasets, que precisa ser um subconjunto
da ordem de classificação de entrada. Todos esses campos precisam ser usados na joincondition
, uma vez que definem a ordem na qual os campos passam pela operação STEPPED.
Return: JOIN retorna um conjunto de registros.
A função JOIN produz um conjunto de resultados baseado na interseção de dois ou mais datasets ou indíces (conforme
determinado por joincondition).
JOIN em Dois Datasets
JOIN(leftrecset, rightrecset, joincondition [, transform] [, jointype] [, joinflags] )
A primeira forma de JOIN processa todos os pares de registros em leftrecset e rightrecset e avalia a condition
para localizar registros correspondentes. Se a condition e jointype especificarem que o par de registros se qualifica
para processamento, a função transform é executada, gerando o resultado.
JOIN classifica/distribui dinamicamente o leftrecset e rightrecset conforme necessário para realizar sua operação com
base na condition especificada; assim sendo , orecordset resultante não tem garantia de estar na mesma ordem que
os recordsets de entrada. Se JOIN realizar uma classificação dinâmica de seus recordsets de entrada, essa nova ordem
de classificação não pode ser usada para além da execução de JOIN. Esse princípio também se aplica a qualquer função
GROUPing – os registros são desagrupados automaticamente conforme necessário, exceto nas circunstâncias a seguir:
* Para junções LOOKUP e ALL, o GROUPing e a ordem de classificaçãode leftrecset são preservados
* Para junções KEYED, o GROUPing (mas não a ordem de classificação) do leftrecset é preservado.
© 2020 HPCC Systems. All rights reserved
73
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
Lógica de Correspondência - JOIN
O registro que corresponde a joincondition é processado internamente em duas partes:
"equality" (hard
match)
Toda a lógica "LEFT.field = RIGHT.field" simples que define os registros correspondentes. Para
JOINs que usam chaves, todos esses precisam ser campos na chave para se qualificarem para
inclusão nessa parte. Se não houver uma parte de "igualdade" na lógica joincondition , um erro
"JOIN too complex" (operação JOIN muito complexa) será exibido.
"non-
equality" (soft
match)
Todos os outros critérios de correspondência na lógica joincondition , como expressões
"LEFT.field > RIGHT.field" ou qualquer lógica OR, que possam estar envolvidos na determi-
nação final de que qualquer registro leftrecset e rightrecset realmente coincidem.
Essa divisão de lógica interna permite que o código JOIN seja otimizado para máxima eficiência – primeiro a lógica
de "igualdade" é avaliada para proporcionar um resultado temporário que é então avaliado em relação a qualquer
"desigualdade" na joincondition correspondente.
Opções
As opções de joinflags a seguir podem ser especificadas para determinar exatamente como JOIN é executado.
[, PARTITION LEFT | PARTITION RIGHT | [MANY] LOOKUP [ FEW] ] | GROUPED | ALL | NOSORT
[ ( which ) ] | KEYED [ (index) [, UNORDERED ] ] | LOCAL | HASH ]][, KEEP(n) ] [, ATMOST( [ condition,
] n ) ] [, LIMIT( value [, SKIP | transform | FAIL ]) ] [, SKEW(limit [, target] ) [, THRESHOLD( size ) ] ] [,
SMART ] [, UNORDERED | ORDERED( bool ) ] [, STABLE | UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ]
[, ALGORITHM( name ) ]
PARTITION LEFT
| RIGHT
Especifica qual recordset proporciona os pontos de partição que determinam como os reg-
istros são classificados e distribuídos entre os nós do supercomputador. PARTITION RIGHT
especifica o rightrecset , enquanto PARTITION LEFT especifica o leftrecset. Se omitido,
PARTITION LEFT é o padrão.
[MANY] LOOKUP Especifica o rightrecset , sendo um arquivo relativamente pequeno de registros de consulta que
podem ser copiados completamente para cada nó. MANY não estiver presente, os registros
rightrecset têm uma relação de muitos para 0/1 com os registros em leftrecset (para cada
registro em leftrecset há no máximo 1 registro em rightrecset. Se MANY estiver presente, os
registros rightrecset têm uma relação de muitos para 0/muitos com os registros em leftrecset.
Essa opção permite que o otimizador evite a classificação desnecessária do leftrecset. Válido
apenas para os jointypes internos, LEFT OUTER ou LEFT ONLY. As opções ATMOST,
LIMIT e KEEP são suportadas em conjunto com MANYLOOKUP.
SMART Especifica para usar uma consulta na memória quando possível, mas usa uma operação de
junção distribuída se o dataset direito for muito grande.
FEW Especifica que o LOOKUP rightrecset possui poucos registros, de forma que pouca memória
é utilizada, permitindo que várias junções de consultas sejam incluídas no mesmo subgráfico
Thor.
GROUPED Especifica a mesma ação de MANY LOOKUP, mas preserva o agrupamento Usado princi-
palmente no motor de entrega rápida de dados. Válido apenas para os jointypes internos, LEFT
OUTER ou LEFT ONLY. As opções ATMOST, LIMIT e KEEP são suportadas em conjunto
com GROUPED.
ALL Especifica que o rightrecset é um arquivo pequeno que pode ser copiado completamente para
cada nó, o que permite que o compilador ignore a falta de qualquer parte de "igualdade" em re-
lação à condição; isso elimina o erro "JOIN too complex" (“operação JOIN muito complexa”)
que a condição normalmente produziria. Se uma parte de "igualdade" estiver presente, o JOIN
© 2020 HPCC Systems. All rights reserved
74
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
é executado internamente como MANY LOOKUP. A opção KEEP é suportada juntamente
com essa opção.
NOSORT Realiza o JOIN sem classificar dinamicamente as tabelas. Isso implica que leftrecset e/ou
rightrecset precisam ter sido previamente classificados e particionados com base nos campos
especificados em joincondition para que os registros possam ser facilmente combinados.
which Opcional. As palavras-chave LEFT ou RIGHT para indicar que leftrecset ou rightrecset foram
previamente classificados. Se omitidas, NOSORT assume que ambos leftrecset e rightrecset
foram classificados previamente.
KEYED Especifica o uso de acesso indexado em rightrecset (consulte INDEX).
index Opcional. O nome de um INDEX no rightrecset para um JOIN full-keyed (consulte abaixo).
Se omitido, indica que o rightrecset sempre será um INDEX (útil quando rightrecset é especi-
ficado como um parâmetro para uma função).
UNORDERED Opcional. Especifica que a operação KEYED JOIN não preserva a ordem de classificação do
leftrecset.
LOCAL Especifica que a operação é realizada em cada nó de supercomputador de forma independente,
sem exigir interação com todos os outros nós para obter dados; a operação mantém a dis-
tribuição de qualquer operação DISTRIBUTE anterior.
HASH Especifica um DISTRIBUTE implícito do leftrecset e rightrecset entre os nós de supercom-
putador com base na joincondition para que cada nó possa realizar seu trabalho com os dados
locais.
KEEP(n) Especifica o número máximo de registros correspondentes (n) a ser gerado no conjunto de
resultados. Se omitido, todas as correspondências são mantidas. Isso é útil nos casos em que
possa haver muitos pares correspondentes e caso você precise limitar o número no conjunto
de resultados. KEEP não é suportado para RIGHT EXTER, RIGHT ONLY, LEFT ONLY ou
FULL ONLY jointypes.
ATMOST Especifica o número máximo de registros correspondentes que, se excedido, elimina to-
das essas correspondências do conjunto de resultados. Isso é útil para situações nas quais
você elimina pares de registros com "excesso de correspondências" do conjunto de re-
sultados. ATMOST não é suportado para RIGHT EXTER ONLY ou FULL ONLY join-
types. Há duas formas: ATMOST(condição, n) – o máximo é computado apenas para a
condição. ATMOST(n) – o máximo é computado para toda a joincondition, exceto caso
KEYED seja usado na joincondition (caso no qual aspenas as expressões KEYED são us-
adas).Quando ATMOST é especificado (e o JOIN não é full-keyed ou half-keyed), a join-
condition e a condition podem incluir comparações de campo da string que usam indexação
de strings com um asterisco como o limite máximo, como neste exemplo: J1 := JOIN(dsL,d-
sR, LEFT.name[1..*]=RIGHT.name[3..*] AND LEFT.val < RIGHT.val, T(LEFT,RIGHT),
ATMOST(LEFT.name[1..*]=RIGHT.name[3..*],3)); TO asterisco indica correspondência do
máximo de caracteres necessários para reduzir o número de possíveis correspondências para
abaixo do número ATMOST (n).
condition Uma parte da expressão joincondition .
n Especifica o número máximo de correspondências permitidas.
LIMIT Especifica o número máximo de registros correspondentes que, se excedido, ocasiona a falha
da workunit ou elimina todas essas correspondências do conjunto de resultados. Isso é útil
para situações nas quais você elimina pares de registros com "excesso de correspondências"
do conjunto de resultados. Normalmente usado para JOINS KEYED e “Half-Keyed” (con-
sulte abaixo), LIMIT se difere de ATMOST principalmente por seu efeito em uma junção
LEFT OUTER, na qual um registro leftrecset com um número excessivo de registros corre-
spondentes seria tratado como não correspondente pelo ATMOST (o registro leftrecset estaria
no resultado sem registros rightrecset correspondentes), enquanto LIMIT faria com que toda
© 2020 HPCC Systems. All rights reserved
75
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
a workunit falhasse ou executaria o SKIP no registro (eliminando o registro leftrecset total-
mente do resultado). Se omitido, o padrãoé LIMIT(10000). O LIMIT é aplicado ao record set
que atende à parte de correspondência rígida ("equality") da joincondition , porém antes de a
correspondência suave ("desigualdade") da joincondition ser avaliada.
value O número máximo de correspondências permitido; LIMIT(0) é ilimitado.
SKIP Opcional. Especifica a eliminação de registros correspondentes que ultrapassam o valor máx-
imo do resultado LIMIT, em vez da falha da workunit.
transform Opcional. Especifica a emissão de um registro único produzido por transform em vez da falha
da workunit (similar à opção ONFAIL da função LIMIT).
FAIL Opcional. Especifica o uso do FAIL ação para configurar a mensagem de erro quando a worku-
nit falha.
SKEW Indica que você sabe que os dados para essa junção não serão espalhados uniformemente entre
os nós (serão distorcidos após ambos os arquivos terem sido distribuídos baseados na condition
da junção), e que você opta por substituir o padrão especificando seu próprio valor limite para
permitir que a workunit continue apesar da distorção. Só é válido em junções sem chave (a
opção KEYED não está presente e o rightrecset não é um INDEX).
limit Um valor entre zero (0) e um (1,0 = 100%) indicando a porcentagem máxima da distorção a
ser permitida antes que a workunit falhe (o padrão é 0,1 = 10%).
target Opcional. Um valor entre zero (0) e um (1,0 = 100%) indicando a porcentagem máxima de-
sejada da distorção a ser permitida (o padrão é 0,1 = 10%).
THRESHOLD Indica o tamanho mínimo de uma parte única do leftrecset ou rightrecset antes que o limite
de SKEW seja determinado. Só é válido em junções sem chave (a opção KEYED não está
presente e o rightrecset não é um INDEX).
size Um valor inteiro indicando o número mínimo de bytes para uma parte única.
UNORDERED Opcional. Especifica que a ordem do registro de resultado não é importante.
ORDERED Especifica a importância da ordem do registro de resultado.
bool Quando for False, especifica que a ordem do registro de resultado não é importante. Quando
for True, especifica a ordem padrão do registro de resultado.
STABLE Opcional. Especifica que a ordem do registro de entrada é importante.
UNSTABLE Opcional. Especifica que a ordem do registro de entrada não é importante.
PARALLEL Opcional. Tenta avaliar essa atividade em paralelo.
numthreads Opcional. Tenta avaliar essa atividade usando os threads numthreads .
ALGORITHM Opcional. Substitui o algoritmo usado para essa atividade.
name O algoritmo a ser usado para essa atividade. Precisa fazer parte da lista de algoritmos com-
patíveis com as opções STABLE e UNSTABLE da função SORT.
As opções a seguir são mutualmente exclusivas e só podem ser usadas para a exclusão das outras nessa lista.
PARTITION LEFT | PARTITION RIGHT | [MANY] LOOKUP | GROUPED | ALL | NOSORT | HASH
Além dessa lista, as opções KEYED e LOCAL também são mutualmente exclusivas com as opções acima listadas,
mas não umas com as outras. Quando ambas as opções KEYED e LOCAL são especificadas, apenas as partes INDEX
em cada nó são acessadas por esse nó.
Normalmente, o leftrecset deve ser maior que o rightrecset para evitar problemas de distorção (porque PARTITION
LEFT é o comportamento padrão). Se as opções LOOKUP ou ALL forem especificadas, o rightrecset precisa ser
pequeno o bastante para ser carregado na memória em cada nó e a operação é então implicitamente LOCAL. A opção
ALL não é prática se o rightrecset for maior que alguns poucos milhares de registros (devido ao número de compara-
© 2020 HPCC Systems. All rights reserved
76
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
ções necessário). O tamanho do rightrecset é irrelevante no caso de JOINs "half-keyed" e “full-keyed" (consulte a
discussão sobre Join Chaveado).
Use o SMART quando o dataset do lado direito provavelmente for pequeno o bastante para caber na memória, mas
sem garantias de tal.
Se aparecer um erro similar a esse:
“error: 1301: Pool memory exhausted:..."
significa que o rightrecset é muito grande e uma operação LOOKUP JOIN não deve ser usada. Uma operação SMART
JOIN pode ser uma boa opção neste caso.
JOINS KEYEDs
Uma JOIN full-keyed usa a opção KEYED, e a joincondition precisa ser baseada nos campos index. Na verdade, a
junção é feita entre o leftrecset e o index no rightrecset – o index precisa do campo de ponteiro de registro do dataset
(virtual(fileposition)) para buscar corretamente os registros do rightrecset. A operação join KEYED típica especifica
apenas o rightrecset para o TRANSFORM.
Se a rightrecset for um INDEX, a operação é uma JOIN “half-keyed”. Normalmente, o INDEX em uma JOIN de
“half-keyed” contém campos de “payload", que frequentemente eliminam a necessidade de leitura do dataset de base.
Se esse for o caso, o INDEX de “payload" não precisa do campo de ponteiro de registro (virtual(fileposition)) do
dataset declarado. Para uma JOIN de half-keyed, a joincondition pode usar apenas as palavras-chave KEYED e WILD
que estão disponíveis para uso apenas nos filtros INDEX.
Para ambos os tipos de junção KEYED (com chave), qualquer GROUPing dos conjuntos de registro de base permanece
inalterado. Consulte KEYED e WILD para ler uma discussão sobre a filtragem de INDEX.
Lógica do Join
A operação JOIN segue a seguinte lógica:
1. Classificação/distribuição de registro para obter possíveis correspondências nos mesmos nós.
As opções PARTITION LEFT, PARTITION RIGHT, LOOKUP, ALL, NOSORT, KEYED, HASH e LOCAL indicam
como isso acontece. Essas opções são mutualmente exclusivas; apenas uma pode ser especificada, sendo PARTITION
LEFT o padrão. SKEW e THRESHOLD podem modificar o comportamento solicitado. LOOKUP também possui o
efeito de deduplicação de rightrecset pela joincondition.
2. Correspondência de registros.
A joincondition, LIMIT e ATMOST determinam como isso é feito.
Um limite implícito de 10000 é adicionado quando não há LIMIT especificado E o seguinte é verdadeiro:
Não há limite especificado para ATMOST E e não é um LEFT ONLY JOIN E (ou nenhum limite KEEP especificado
OU o JOIN que tem um postfilter).
3. Determina quais correspondências devem ser especificadas para transform.
O jointype determina isso.
4. Gera registros de resultados através da função TRANSFORM.
O parâmetro transform implícito ou explícito determina isso.
© 2020 HPCC Systems. All rights reserved
77
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
5. Filtrar registros de resultados com SKIP.
Se transform para um par de registros resultar em SKIP, então o registro de resultado não é contado em nenhum total
da opção KEEP.
6. Limitar registros de resultados com KEEP.
Quaisquer registros de resultados para um determinado registro leftrecset acima e além do valor KEEP permitido
são descartados. Em uma junção FULLOUTER , registros rightrecset que não correspondem a nenhum registro são
tratados como se todos fossem correspondências de diferentes registros leftrecset padrão (isto é, o contador KEEP é
reiniciado para cada um).
Requerimentos da Função TRANSFORM - JOIN
A função transform : um registro LEFT formatado como leftrecset e/ou um registro RIGHT formatado como o
rightrecset (que pode estar em diferentes formatos). O formato do conjunto de registros resultante não precisa ser o
mesmo que nenhum conjunto de registros de entrada.
Tipos de Join: Dois DATASETS
Os jointypes a seguir produzem os seguintes tipos de resultados com base na correspondência de registros produzida
por joincondition:
inner (default) Apenas os registros existentes em ambos leftrecset e rightrecset.
LEFT OUTER No mínimo um registro para cada um no leftrecset.
RIGHT OUTER No mínimo um registro para cada um no rightrecset.
FULL OUTER No mínimo um registro para cada um no leftrecset e rightrecset.
LEFT ONLY Um registro para cada registro leftrecset sem correspondência no rightrecset.
RIGHT ONLY Um registro para cada registro rightrecset sem correspondência no leftrecset.
FULL ONLY Um registro para cada registro leftrecsete rightrecset sem correspondência no conjunto de reg-
istro oposto.
Exemplo:
outrec := RECORD
 people.id;
 people.firstname;
 people.lastname;
END;
RT_folk := JOIN(people(firstname[1] = 'R'),
 people(lastname[1] = 'T'),
 LEFT.id=RIGHT.id,
 TRANSFORM(outrec,SELF := LEFT));
OUTPUT(RT_folk);
//*********************** Half KEYED JOIN example:
peopleRecord := RECORD
 INTEGER8 id;
 STRING20 addr;
END;
peopleDataset := DATASET([{3000,'LONDON'},{3500,'SMITH'},
 {30,'TAYLOR'}], peopleRecord);
PtblRec doHalfJoin(peopleRecord l) := TRANSFORM
© 2020 HPCC Systems. All rights reserved
78
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
 SELF := l;
END;
FilledRecs3 := JOIN(peopleDataset, SequenceKey,
 LEFT.id=RIGHT.sequence,doHalfJoin(LEFT));
FilledRecs4 := JOIN(peopleDataset, AlphaKey,
 LEFT.addr=RIGHT.Lname,doHalfJoin(LEFT));
//******************* Full KEYED JOIN example:
PtblRec := RECORD
 INTEGER8 seq;
 STRING2 State;
 STRING20 City;
 STRING25 Lname;
 STRING15 Fname;
END;
PtblRec Xform(person L, INTEGER C) := TRANSFORM
 SELF.seq := C;
 SELF.State := L.per_st;
 SELF.City := L.per_full_city;
 SELF.Lname := L.per_last_name;
 SELF.Fname := L.per_first_name;
END;
Proj := PROJECT(Person(per_last_name[1]=per_first_name[1]),
 Xform(LEFT,COUNTER));
PtblOut := OUTPUT(Proj,,'~RTTEMP::TestKeyedJoin',OVERWRITE);
Ptbl := DATASET('RTTEMP::TestKeyedJoin',
 {PtblRec,UNSIGNED8 __fpos {virtual(fileposition)}},
 FLAT);
AlphaKey := INDEX(Ptbl,{lname,fname,__fpos},
 '~RTTEMPkey::lname.fname');
SeqKey := INDEX(Ptbl,{seq,__fpos},'~RTTEMPkey::sequence');
Bld1 := BUILD(AlphaKey ,OVERWRITE);
Bld2 := BUILD(SeqKey,OVERWRITE);
peopleRecord := RECORD
 INTEGER8 id;
 STRING20 addr;
END;
peopleDataset := DATASET([{3000,'LONDON'},{3500,'SMITH'},
 {30,'TAYLOR'}], peopleRecord);
joinedRecord := RECORD
 PtblRec;
 peopleRecord;
END;
joinedRecord doJoin(peopleRecord l, Ptbl r) := TRANSFORM
 SELF := l;
 SELF := r;
END;
FilledRecs1 := JOIN(peopleDataset, Ptbl,LEFT.id=RIGHT.seq,
 doJoin(LEFT,RIGHT), KEYED(SeqKey));
FilledRecs2 := JOIN(peopleDataset, Ptbl,LEFT.addr=RIGHT.Lname,
 doJoin(LEFT,RIGHT), KEYED(AlphaKey));
SEQUENTIAL(PtblOut,Bld1,Bld2,OUTPUT(FilledRecs1),OUTPUT(FilledRecs2))
JOIN com Set of Datasets
JOIN(setofdatasets, joincondition, transform, SORTED( fields) [, jointype] [, UNORDERED | ORDERED( bool ) ]
[, STABLE | UNSTABLE ] [, PARALLEL [ ( numthreads ) ] ] [, ALGORITHM( name ) ] )
A segunda forma de JOIN é similar à função MERGEJOIN no sentido de que usa um SET OF DATASETs como
o seu primeiro parâmetro. Isso oferece a possibilidade de unir mais de dois datasets em uma única operação.
© 2020 HPCC Systems. All rights reserved
79
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
Lógica de Correspondência de Registros
O registro correspondente a joincondition pode conter duas partes: uma condição STEPPED que pode opcionalmente
ser ANDed com condições sem STEPPED. A expressão STEPPED contém as principais expressões de igualdade dos
campos da opção SORTED (componentes à direita podem ser comparações de intervalo se os valores de intervalo
não dependem das linhas LEFT e RIGHT), juntamente com ANDed, usando LEFT e RIGHT como qualificadores de
dataset. Caso não esteja presente, a condição STEPPED é deduzida dos campos especificados pela opção SORTED.
A ordem dos datasets em setofdatasets pode ser importante para a maneira pela qual joincondition é avaliado. A
joincondition é duplicada entre pares adjacentes de datasets, o que significa que essa joincondition:
 LEFT.field = RIGHT.field
quando aplicada em um setofdatasets de três datasets, é logicamente equivalente a:
 ds1.field = ds2.field AND ds2.field = ds3.field
Requisitos de função do TRANSFORM - JOIN setof-
datasets
A função transform precisa usar no mínimo um parâmetro que precisa ter uma das duas formas:
LEFT Formatado como qualquer um dos setofdatasets. Isso indica o primeiro dataset no setofdatasets.
ROWS(LEFT) Formatado como qualquer um dos setofdatasets. Isso indica um conjunto de registro composto
de todos os registros de qualquer dataset no setofdatasets que corresponde ao joincondition
– isso não pode incluir todos os datasets no setofdatasets, dependendo de qual jointype for
especificado.
O formato do conjunto final de registros de resultado precisa ser o mesmo que os datasets de entrada.
Tipos de Join: setofdatasets
Os jointypes a seguir produzem os seguintes tipos de resultados com base na correspondência de registros produzida
por joincondition:
INNER Esse é o padrão se nenhum jointype for especificado. Apenas os registros presentes em todos
os datasets no setofdatasets.
LEFT OUTER No mínimo um registro para cada registro no primeiro dataset no setofdatasets.
LEFT ONLY Um registro para cada um no primeiro dataset no setofdatasets para o qual não há corre-
spondência em nenhum dos datasets subsequentes.
MOFN(min [,max]) Um registro para cada registro com registros correspondentes no número mínimo de datasets
adjacentes no setofdatasets. Se o número máximo for especificado, o registro não será incluí-
do se o número máximo de correspondências de datasets for excedido.
Exemplo:
Rec := RECORD,MAXLENGTH(4096)
 STRING1 Letter;
 UNSIGNED1 DS;
 UNSIGNED1 Matches := 0;
 UNSIGNED1 LastMatch := 0;
 SET OF UNSIGNED1 MatchDSs := [];
END;
© 2020 HPCC Systems. All rights reserved
80
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
ds1 := DATASET([{'A',1},{'B',1},{'C',1},{'D',1},{'E',1}],Rec);
ds2 := DATASET([{'A',2},{'B',2},{'H',2},{'I',2},{'J',2}],Rec);
ds3 := DATASET([{'B',3},{'C',3},{'M',3},{'N',3},{'O',3}],Rec);
ds4 := DATASET([{'A',4},{'B',4},{'R',4},{'S',4},{'T',4}],Rec);
ds5 := DATASET([{'B',5},{'V',5},{'W',5},{'X',5},{'Y',5}],Rec);
SetDS := [ds1,ds2,ds3,ds4,ds5];
Rec XF(Rec L,DATASET(Rec) Matches) := TRANSFORM
 SELF.Matches := COUNT(Matches);
 SELF.LastMatch := MAX(Matches,DS);
 SELF.MatchDSs := SET(Matches,DS);
 SELF := L;
END;
j1 := JOIN(SetDS,
 STEPPED(LEFT.Letter=RIGHT.Letter),
 XF(LEFT,ROWS(LEFT)),SORTED(Letter));
j2 := JOIN(SetDS,
 STEPPED(LEFT.Letter=RIGHT.Letter),
 XF(LEFT,ROWS(LEFT)),SORTED(Letter),LEFT OUTER);
j3 := JOIN(SetDS,
 STEPPED(LEFT.Letter=RIGHT.Letter), 
 XF(LEFT,ROWS(LEFT)),SORTED(Letter),LEFT ONLY);
j4 := JOIN(SetDS,
 STEPPED(LEFT.Letter=RIGHT.Letter),
 XF(LEFT,ROWS(LEFT)),SORTED(Letter),MOFN(3));
j5 := JOIN(SetDS,
 STEPPED(LEFT.Letter=RIGHT.Letter),
 XF(LEFT,ROWS(LEFT)),SORTED(Letter),MOFN(3,4));
OUTPUT(j1);
OUTPUT(j2);
OUTPUT(j3);
OUTPUT(j4);
OUTPUT(j5);
Ver também: Estrutura TRANSFORM,Estrutura RECORD,SKIP ,STEPPED, KEYED/WILD, MERGEJOIN
© 2020 HPCC Systems. All rights reserved
81
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
Exemplo de JOIN funcional
JOIN
Abra BWR_Training_Examples.JOIN_Example em uma janela ECL e envie esta consulta:
MyRec := RECORD
 STRING1 Value1;
 STRING1 Value2;
END;
LeftFile := DATASET([{'C','A'},
 {'X','B'},
 {'A','C'}],MyRec);
RightFile := DATASET([{'C','X'},
 {'B','Y'},
 {'A','Z'}],MyRec);
MyOutRec := RECORD
 STRING1 Value1;
 STRING1 LeftValue2;
 STRING1 RightValue2;
END;
MyOutRec JoinThem(MyRec L, MyRec R) := TRANSFORM
 SELF.Value1 := IF(L.Value1<>'', L.Value1, R.Value1);
 SELF.LeftValue2 := L.Value2;
 SELF.RightValue2 := R.Value2;
END;
InnerJoinedRecs := JOIN(LeftFile,RightFile,LEFT.Value1 = RIGHT.Value1,
 JoinThem(LEFT,RIGHT));
LOutJoinedRecs := JOIN(LeftFile,RightFile,LEFT.Value1 = RIGHT.Value1,
 JoinThem(LEFT,RIGHT),LEFTOUTER);
ROutJoinedRecs := JOIN(LeftFile,RightFile,LEFT.Value1 = RIGHT.Value1,
 JoinThem(LEFT,RIGHT),RIGHT OUTER);
FOutJoinedRecs := JOIN(LeftFile,RightFile,LEFT.Value1 = RIGHT.Value1,
 JoinThem(LEFT,RIGHT),FULL OUTER);
LOnlyJoinedRecs := JOIN(LeftFile,RightFile,LEFT.Value1 = RIGHT.Value1,
 JoinThem(LEFT,RIGHT),LEFT ONLY);
ROnlyJoinedRecs := JOIN(LeftFile,RightFile,LEFT.Value1 = RIGHT.Value1,
 JoinThem(LEFT,RIGHT),RIGHT ONLY);
FOnlyJoinedRecs := JOIN(LeftFile,RightFile,LEFT.Value1 = RIGHT.Value1,
 JoinThem(LEFT,RIGHT),FULL ONLY);
OUTPUT(InnerJoinedRecs,,NAMED('Inner'));
OUTPUT(LOutJoinedRecs,,NAMED('LeftOuter'));
OUTPUT(ROutJoinedRecs,,NAMED('RightOuter'));
OUTPUT(FOutJoinedRecs,,NAMED('FullOuter'));
OUTPUT(LOnlyJoinedRecs,,NAMED('LeftOnly'));
OUTPUT(ROnlyJoinedRecs,,NAMED('RightOnly'));
OUTPUT(FOnlyJoinedRecs,,NAMED('FullOnly'));
/* InnerJoinedRecs result set is: 
 Rec# Value1 LeftValue2 RightValue2
 1 A C Z
 2 C A X
 
LOutJoinedRecs result set is:
 Rec# Value1 LeftValue2 RightValue2
 1 A C Z
© 2020 HPCC Systems. All rights reserved
82
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
 2 C A X
 3 X B
ROutJoinedRecs result set is:
 Rec# Value1 LeftValue2 RightValue2
 1 A C Z
 2 B Y
 3 C A X
FOutJoinedRecs result set is:
 Rec# Value1 LeftValue2 RightValue2
 1 A C Z
 2 B Y
 3 C A X
 4 X B
LOnlyJoinedRecs result set is:
 Rec# Value1 LeftValue2 RightValue2
 1 X B
ROnlyJoinedRecs result set is:
 Rec# Value1 LeftValue2 RightValue2
 1 B Y
FOnlyJoinedRecs result set is:
 Rec# Value1 LeftValue2 RightValue2
 1 B Y
 2 X B
*/
© 2020 HPCC Systems. All rights reserved
83
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
Diagrama de exemplo funcional JOIN
© 2020 HPCC Systems. All rights reserved
84
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
INTFORMAT
INTFORMAT(expression, width, mode)
expression A expressão que especifica o valor inteiro a ser formatado.
width O tamanho da string na qual o valor será alinhado à direita.
mode O formato tipo: 0 = preenchimento em branco, 1 = preenchimento com zero.
Return: INTFORMAT retorna um único valor.
A função INTFORMAT retorna o valor da expressão formatada como string justificada à direita dos caracteres de
largura .
Exemplo:
val := 123456789;
OUTPUT(INTFORMAT(val,20,1));
 //formats as '00000000000123456789'
OUTPUT(INTFORMAT(val,20,0));
 //formats as ' 123456789'
Ver também: REALFORMAT
© 2020 HPCC Systems. All rights reserved
85
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
Exercício 7a
Especificação do exercício:
Crie uma BWR que produza um arquivo de saída de STD_Persons com os valores City, State e Zip removidos e
substituídos por links para File_LookupCSZ.
Depois que o arquivo for produzido, defina sua estrutura RECORD e o DATASET para uso posterior. Coloque a
definição RECORD em uma estrutura MODULE, nomeando a definição de Layout na estrutura MODULE. Coloque
a definição DATASET na mesma estrutura MODULE, nomeando a definição de File dentro da estrutura.
Requisitos:
1. Os nomes dos arquivos de definição a serem criados para este exercício são:
BWR_File_Persons_Slim
File_Persons_Slim
2. O nome do arquivo OUTPUT deve começar com ~CLASS, seguido pelas suas iniciais, seguidas por OUT::Person-
s_Slim, como neste exemplo:
 ~CLASS::XX::OUT::Persons_Slim
Comparação do resultado
Use uma janela do Builder para executar a consulta e procure na lista de arquivos lógicos do ECL Watch Logical Files
o arquivo recém-gerado. Verifique se o tamanho é de cerca de 94.236.800 e se há 841.400 registros.
© 2020 HPCC Systems. All rights reserved
86
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
Exercício 7b
Especificação do exercício:
Crie uma BWR que reproduza um arquivo de saída cujos dados e estrutura duplicam exatamente o arquivo File_Per-
sons original com o qual começamos. Use a opção LOOKUP no JOIN para unir as tabelas File_Persons_Slim e
File_LookupCSZ e criar o resultado.
Requisitos:
1. O nome do arquivo de definição a ser criado para este exercício é:
BWR_RejoinPersons
2. O nome do arquivo OUTPUT deve começar com ~CLASS, seguido pelas suas iniciais, seguidas por OUT::Person-
s_Rejoined , como neste exemplo:
 ~CLASS::XX::OUT::Persons_Rejoined
3. Você precisará restaurar os campos de data e compactá-los de volta aos seus tipos de dados originais.
4. Você precisará converter os nomes em maiúsculos de volta em capitalização apenas de título (Dica: use a função
da biblioteca String ToTitleCase no TRANSFORM).
5. Não se esqueça dos campos MaritalStatus e DependentCount.
6. Execute os requisitos de transformação de dados usando sua estrutura TRANSFORM.
Comparação do resultado
Escreveremos o código ECL no próximo exercício de laboratório para realizar uma comparação entre o arquivo "re-
joined" e o arquivo original Persons que passou pelo processo de spray.
© 2020 HPCC Systems. All rights reserved
87
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Juntando arquivos
Exercício 7c
Especificação do exercício:
Crie código BWR para combinar (append) o arquivo Person original que foi submetido ao spray com a tabela “rejoined"
que criamos no Exercício 7be, em seguida, faça a deduplicação dos registros combinados por todos os campos. Envie
os resultados de todos os registros de deduplicação, que devem ser zero para os 2 arquivos combinados.
Requisitos:
1. O nome do atributo a ser criado para este exercício é:
BWR_RejoinPersonsCompare
2. Crie um DATASET para a tabela que você criou no Exercício 7b.
3. ANEXAR a tabela Person original submetida ao spray com a tabela rejoined no Exercício 7b.
4. ORDENAR a tabela anexada usando a palavra-chave WHOLE RECORD (ou apenas RECORD) para indicar que
todos os campos nessa estrutura precisam ser classificados.
5. DEDUP as tabelas anexadas classificadas usando a palavra-chave WHOLE RECORD (ou apenas RECORD) para
indicar que todos os campos nessa estrutura serão comparados.
Comparação do resultado
Abra uma nova janela do Builder e produza a diferença das contagens do conjunto de registros deduplicados e a
contagem original da tabela rejoined. Os resultados para cada uma das contagens da tabela devem ser zero.
© 2020 HPCC Systems. All rights reserved
88
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Soluções para exercícios de
laboratório
Exercício 1
Solução - File_Persons.ECL:
EXPORT File_Persons := MODULE
 EXPORT Layout := RECORD
 UNSIGNED8 ID;
 STRING15 FirstName;
 STRING25 LastName;
 STRING15 MiddleName;
 STRING2 NameSuffix;
 STRING8 FileDate;
 UNSIGNED2 BureauCode;
 STRING1 MaritalStatus;
 STRING1 Gender;
 UNSIGNED1 DependentCount;
 STRING8 BirthDate;
 STRING42 StreetAddress;
 STRING20 City;
 STRING2 State;
 STRING5 ZipCode;
 END;
 EXPORT File := DATASET('~CLASS::BMF::Intro::Persons', Layout,FLAT);
END;
Isso ilustra o uso da forma mais simples da estrutura RECORD, onde tudo o que você define é o tipo e o nome do
valor de cada campo. Essa forma é mais comumente usada para definir o layout de campo dos DATASETs, embora
também possa ser usada para definir o formato de saída de uma função TRANSFORM. Existem duas outras formas
maiscomplexas usadas pela função TABLE e outra que define estruturas de conjuntos de dados filhos que serão
introduzidas em outra aula.
As opções FLAT e THOR no DATASET são sinônimos que indicam que não há delimitadores de campo no arquivo,
diferentemente dos arquivos CSV ou XML. Os registros podem ter comprimento-fixo, com ou sem delimitadores de
registro (carriage return and/or line feed), ou comprimento variável, com ou sem delimitadores de registro (dependendo
de como a variabilidade é definida). Os registros que contêm dados de comprimento-fixo seguidos por um número
variável de registros de conjuntos de dados filhos de comprimento fixo não precisam de delimitadores de registro,
enquanto os registros de comprimento variável geralmente exigem.
© 2020 HPCC Systems. All rights reserved
89
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 1 (continuação)
Solução - File_Accounts.ECL:
EXPORT File_Accounts := MODULE
 EXPORT Layout := RECORD
 UNSIGNED8 PersonID;
 STRING8 ReportDate;
 STRING2 IndustryCode;
 UNSIGNED4 Member;
 STRING8 OpenDate;
 STRING1 TradeType;
 STRING1 TradeRate;
 UNSIGNED1 Narr1;
 UNSIGNED1 Narr2;
 UNSIGNED4 HighCredit;
 UNSIGNED4 Balance;
 UNSIGNED2 Terms;
 UNSIGNED1 TermTypeR;
 STRING20 AccountNumber;
 STRING8 LastActivityDate;
 UNSIGNED1 Late30Day;
 UNSIGNED1 Late60Day;
 UNSIGNED1 Late90Day;
 STRING1 TermType;
 END;
 EXPORT File := DATASET('~CLASS::BMF::Intro::Accounts',Layout,CSV);
END;
Essa é novamente a forma mais simples da estrutura RECORD, mas ilustra o conceito de definir os campos de texto
de dados numéricos contidos no arquivo CSV como tipos inteiros. Isso tem a vantagem de não exigir a conversão
explícita de tipos com uma operação TABLE ou PROJECT para produzir seus tipos intrínsecos binários.
A opção CSV no DATASET indica que há algum tipo de campo e delimitadores de registro no arquivo. Esta declaração
de arquivo usa os valores padrão (vírgulas e CR/LF), mas qualquer delimitador pode ser especificado usando o conjunto
de csvoptions disponíveis (consulte o PDF de Referência a Linguagem).
© 2020 HPCC Systems. All rights reserved
90
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 2a
Solução - XTAB_Persons_Gender.ECL:
IMPORT $;
r := RECORD
 $.File_Persons.File.Gender;
 INTEGER cnt := COUNT(GROUP);
 END;
EXPORT XTAB_Persons_Gender := TABLE($.File_Persons.File,r,Gender);
Essa é a forma mais simples de relatório crosstab, com um único campo "group by" na função TABLE duplicado na
estrutura RECORD. A função COUNT usa a palavra-chave GROUP para agregar o número de registros File_Persons
que contêm cada valor único do campo Gender.
Observe também que apresentamos neste exercício de laboratório o uso da qualificação $ (cifrão), que permite que
você faça referência facilmente aos atributos contidos no mesmo módulo.
Exercício 2b
Solução - XTAB_Accounts_HighCredit_MaxMin.ECL:
IMPORT $;
layout_min_max := RECORD
 Min_Value := MIN(GROUP, $.File_Accounts.File.HighCredit);
 Max_Value := MAX(GROUP, $.File_Accounts.File.HighCredit);
END;
EXPORT XTAB_Accounts_HighCredit_MaxMin := TABLE($.File_Accounts.File, layout_min_max);
 
A chave deste relatório crosstab é a falta de campos "group by" na função TABLE ou na estrutura RECORD. Isso
garante que File_Accounts seja tratado como um grupo único, permitindo que as funções MAX e MIN determinem
os valores mais alto e mais baixo do campo HighCredit no arquivo.
© 2020 HPCC Systems. All rights reserved
91
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 3a
Solução - BWR_Persons_BureauCode_Cardinality:
IMPORT $;
t := TABLE($.File_Persons.File,
 {$.File_Persons.File.BureauCode});
dt := DISTRIBUTE(t,HASH32(BureauCode));
sdt := SORT(dt,BureauCode,LOCAL);
dsdt := DEDUP(sdt,BureauCode,LOCAL);
COUNT(dsdt);
Esse código usa o formato "vertical slice" de TABLE para limitar a operação apenas ao campo em que estamos in-
teressados em trabalhar. A função DISTRIBUTE usa a função HASH32 para distribuir uniformemente os registros
da TABELA, para que as operações SORT e DEDUP possam usar a opção LOCAL, o que garante o desempenho
ideal da contagem.
Exercício 3b
Solução - BWR_Persons_DependentCount_Population:
IMPORT $;
c1 := COUNT($.File_Persons.File(DependentCount=0));
c2 := COUNT($.File_Persons.File);
d := DATASET([{'Total Records',c2},
 {'Recs=0',c1},
 {'Population Pct',(INTEGER)(((c2-c1)/c2)*100.0)}],
 {STRING15 valuetype,INTEGER val});
OUTPUT(d);
Esse código simplesmente usa uma condição de filtro para determinar o número de registros com um valor “nu-
lo" (nesse caso, zero). A técnica interessante aqui é o uso de um DATASET inline para produzir o resultado da saída.
Exercício 3c
Solução - BWR_Persons_DP:
IMPORT $,STD;
Persons := $.File_Persons.File;
profileResults := STD.DataPatterns.Profile(Persons);
bestrecord := STD.DataPatterns.BestRecordStructure(Persons);
OUTPUT(profileResults, ALL, NAMED('profileResults'));
OUTPUT(bestrecord, ALL, NAMED('BestRecord'));
Esse código perfila o conjunto de dados de treinamento Persons usando as FUNCTIONMACROs built-in DataPat-
terns Profile e BestRecordStructure.
© 2020 HPCC Systems. All rights reserved
92
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 3d
Solução - BWR_StatePopulation:
IMPORT $,Visualizer;
Persons := $.File_Persons.File;
Rec := RECORD
 Persons.State;
 UNSIGNED4 StateCnt := COUNT(GROUP);
END;
OUTPUT(TABLE(Persons,Rec,State),NAMED('choro_usStates'));
Visualizer.Choropleth.USStates('usStates',,'choro_usStates');
© 2020 HPCC Systems. All rights reserved
93
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 4a
Solução - UID_Persons.ECL:
IMPORT $;
Layout_People_RecID := RECORD
 UNSIGNED4 RecID;
 $.File_Persons.Layout;
END;
Layout_People_RecID IDRecs($.File_Persons.Layout L,INTEGER C) := TRANSFORM
 SELF.RecID := C;
 SELF := L;
END;
EXPORT UID_Persons := PROJECT($.File_Persons.File,IDRecs(LEFT,COUNTER)) 
 : PERSIST('~CLASS::BMF::PERSIST::UID_Persons');
Usar PROJECT para atribuir IDs de registro exclusivos é simples de codificar, mas geralmente menos eficiente que a
técnica ITERATE usada no próximo exercício. A operação PROJECT inicia o COUNTER em cada nó apenas quando
o número de registros em cada nó anterior for conhecido. Isso pode ser feito rapidamente se os registros do número
estiverem sendo acessados do disco, mas a simples adição de um filtro de registro pode atrasar consideravelmente
o processo.
© 2020 HPCC Systems. All rights reserved
94
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 4b
Solução - UID_Accounts.ECL:
IMPORT $,Std;
Layout_Accts_RecID := RECORD
 UNSIGNED4 RecID := 0;
 $.File_Accounts.File;
END;
AcctsTbl := TABLE($.File_Accounts.File,Layout_Accts_RecID);
Layout_Accts_RecID IDRecs(Layout_Accts_RecID L, 
 Layout_Accts_RecID R) := TRANSFORM
 SELF.RecID := IF(L.RecID=0,std.system.thorlib.node()+1,L.RecID+CLUSTERSIZE);
 SELF := R;
END;
EXPORT UID_Accounts := ITERATE(AcctsTbl,IDRecs(LEFT,RIGHT),LOCAL)
 :PERSIST('~CLASS::BMF::PERSIST::UID_Accounts');
O uso da função node() e a constante CLUSTERSIZE ECL permitem ao ITERATE usar a opção LOCAL, que garante
a execução mais rápida possível. DISTRIBUTE não é necessário porque o único requisito é que cada registro receba
um número exclusivo e a ordem em si é irrelevante.
© 2020 HPCC Systems. All rights reserved
95
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 5a
Solução - STD_Persons.ECL:
IMPORT $,Std;
EXPORT STD_Persons := MODULE
EXPORT Layout :=RECORD
 $.UID_Persons.RecID;
 $.UID_Persons.ID;
 STRING15 FirstName := std.Str.ToUpperCase($.UID_Persons.FirstName);
 STRING25 LastName := std.Str.ToUpperCase($.UID_Persons.LastName);
 STRING1 MiddleName := std.Str.ToUpperCase($.UID_Persons.MiddleName);
 STRING2 NameSuffix := std.Str.ToUpperCase($.UID_Persons.NameSuffix);
 UNSIGNED4 FileDate := (UNSIGNED4)$.UID_Persons.FileDate;
 $.UID_Persons.BureauCode;
 $.UID_Persons.Gender;
 UNSIGNED4 BirthDate := (UNSIGNED4)$.UID_Persons.BirthDate;
 $.UID_Persons.StreetAddress;
 $.UID_Persons.City;
 $.UID_Persons.State;
 UNSIGNED3 ZipCode := (UNSIGNED3)$.UID_Persons.ZipCode;
 END;
EXPORT File := TABLE($.UID_Persons,Layout)
 : PERSIST('~CLASS::BMF::PERSIST::STD_Persons');
END;
O uso de UNSIGNED4 para conter datas economiza quatro bytes por campo de data, enquanto o UNSIGNED3 para
o ZipCode economiza mais dois. Após examinar os campos dos dados de Persons, descobrimos que MiddleName
sempre possui 1 caractere e a função built-in string ToUpperCase interna converte todos os campos relacionados a
nomes em maiúsculas.
© 2020 HPCC Systems. All rights reserved
96
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 5b
Solução - STD_Accounts.ECL:
IMPORT $;
EXPORT STD_Accounts := MODULE
EXPORT Layout := RECORD
 $.UID_Accounts.RecID;
 $.UID_Accounts.PersonID;
 UNSIGNED4 ReportDate := (UNSIGNED4)$.UID_Accounts.ReportDate;
 $.UID_Accounts.IndustryCode;
 $.UID_Accounts.Member;
 UNSIGNED4 OpenDate := (UNSIGNED4)$.UID_Accounts.OpenDate;
 $.UID_Accounts.TradeType;
 $.UID_Accounts.TradeRate;
 $.UID_Accounts.Narr1;
 $.UID_Accounts.Narr2;
 $.UID_Accounts.HighCredit;
 $.UID_Accounts.Balance;
 $.UID_Accounts.Terms;
 $.UID_Accounts.TermTypeR;
 $.UID_Accounts.AccountNumber;
 UNSIGNED4 LastActivityDate := (UNSIGNED4)$.UID_Accounts.LastActivityDate;
 $.UID_Accounts.Late30Day;
 $.UID_Accounts.Late60Day;
 $.UID_Accounts.Late90Day;
 $.UID_Accounts.TermType;
 END;
 EXPORT File := TABLE($.UID_Accounts,Layout)
 : PERSIST('~CLASS::BMF::PERSIST::STD_Accounts');
END;
A decisão de EXPORTAR uma estrutura RECORD depende se ela será usada em outras definições de arquivo ECL
posteriormente. Caso contrário, não há necessidade de EXPORTÁ-LO. No entanto, essa decisão não precisa ser tomada
no momento em que você a criou - você sempre pode promover sua visibilidade posteriormente. Nesse caso, essa
estrutura RECORD será referenciada posteriormente.
© 2020 HPCC Systems. All rights reserved
97
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 6a
Solução - BWR_Rollup_CSZ.ECL:
IMPORT $;
Layout_T_recs := RECORD
 UNSIGNED4 CSZ_ID := $.STD_Persons.File.RecID;
 $.STD_Persons.File.City;
 $.STD_Persons.File.State;
 $.STD_Persons.File.Zipcode;
 END;
T_recs := TABLE($.STD_Persons.File,Layout_T_recs);
S_recs := SORT(T_recs,ZipCode,State,City);
Layout_T_recs RollCSV(Layout_T_recs L, Layout_T_recs R) := TRANSFORM
 SELF.CSZ_ID := IF(L.CSZ_ID < R.CSZ_ID,L.CSZ_ID,R.CSZ_ID);
 SELF := L;
END;
Rollup_CSZ := ROLLUP(S_Recs,
 LEFT.Zipcode=RIGHT.Zipcode AND
 LEFT.State=RIGHT.State AND
 LEFT.City=RIGHT.City,
 RollCSV(LEFT,RIGHT));
OUTPUT(Rollup_CSZ,,'~CLASS::BMF::OUT::LookupCSZ',OVERWRITE)
O código BWR (Builder Window Runnable) sempre contém pelo menos uma ação (nesse caso, um OUTPUT). Tam-
bém requer que todas as definições ECL exportadas existentes usadas no repositório sejam totalmente qualificadas,
pois o objetivo do código BWR é executá-lo na Janela do Builder. IMPORT $ é um atalho para referenciar explicita-
mente o nome do módulo, e as definições devem ter nomes totalmente qualificados para desambiguá-los. Isso explica
por que os campos definidos na estrutura RECORD Layout_T_recs são todos totalmente qualificados.
A função Roll_CSZ TRANSFORM foi projetada para garantir que o campo CSZ_ID que é mantido seja o número
RecID mais baixo da tabela STD_Persons. Essa é uma técnica padrão a ser usada sempre que você precisar de números
de registro exclusivos e não se importa se eles são sequenciais ou não. Ao derivá-los de um conjunto de valores já
exclusivos, você pode eliminar uma etapa extra do PROJECT para gerar IDs de registro.
© 2020 HPCC Systems. All rights reserved
98
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 6b
Solução - File_LookupCSZ.ECL:
EXPORT File_LookupCSZ := MODULE
 EXPORT Layout := RECORD
 UNSIGNED4 CSZ_ID;
 STRING20 City;
 STRING2 State;
 UNSIGNED3 ZipCode;
 END;
 SHARED Filename := '~CLASS::BMF::OUT::LookupCSZ';
 EXPORT File := DATASET(Filename,Layout,FLAT);
END;
Essa estrutura RECORD simplesmente define o layout do campo do arquivo de pesquisa. A declaração do DATASET
disponibiliza o arquivo de pesquisa para uso em outras operações.
© 2020 HPCC Systems. All rights reserved
99
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 7a
Solução - File_Persons_Slim.ECL:
IMPORT $;
EXPORT File_Persons_Slim := MODULE
 EXPORT Layout := RECORD
 RECORDOF($.STD_Persons.File) AND NOT [City,State,ZipCode];
 // equivalent to:
 // $.STD_Persons.RecID;
 // $.STD_Persons.ID;
 // $.STD_Persons.FirstName;
 // $.STD_Persons.LastName;
 // $.STD_Persons.MiddleName;
 // $.STD_Persons.NameSuffix;
 // $.STD_Persons.FileDate;
 // $.STD_Persons.BureauCode;
 // $.STD_Persons.Gender;
 // $.STD_Persons.BirthDate;
 // $.STD_Persons.StreetAddress;
 UNSIGNED4 CSZ_ID;
 END;
 SHARED Filename := '~CLASS::BMF::OUT::Persons_Slim';
 EXPORT File := DATASET(Filename,Layout,FLAT);
END;
Esse layout herda a maioria das definições de campo de STD_Persons e adiciona o campo CSZ_ID que fornece o link
entre o registro File_Persons_Slim e o registro File_LookupCSZ relacionado. Este módulo também define o arquivo
resultante para uso nas definições subsequentes.
© 2020 HPCC Systems. All rights reserved
100
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 7a (continuação)
Solução - BWR_File_Persons_Slim.ECL:
IMPORT $;
$.File_Persons_Slim.Layout Slimdown($.STD_Persons.File L,
 $.File_LookupCSZ.File R) := TRANSFORM
 SELF.CSZ_ID := R.CSZ_ID;
 SELF := L;
END;
SlimRecs := JOIN($.STD_Persons.File,
 $.File_LookupCSZ.File,
 LEFT.zipcode=RIGHT.zipcode AND
 LEFT.city=RIGHT.city AND
 LEFT.state=RIGHT.state,
 Slimdown(LEFT,RIGHT),LEFT OUTER, LOOKUP);
 
OUTPUT(SlimRecs,,'~CLASS::BMF::OUT::Persons_Slim',overwrite);
A operação JOIN aqui é a chave, permitindo que STD_Persons e File_LookupCSZ se combinem para criar os registros
File_Persons_Slim. O uso da opção LEFT OUTER evita a perda de dados do arquivo Persons original definido no Ex-
ercício 2. A opção LOOKUP também é usada no JOIN, uma vez que existem apenas 20.703 registros File_LookupCSZ,
que ocupariam apenas 600.387 bytes de memória em cada nó quando totalmente carregados. Como cada nó possui
pelo menos dois gigabytes de RAM, é razoável usar LOOKUP para carregar completamente esse arquivo.
© 2020 HPCC Systems. All rights reserved
101
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 7b
Solução - BWR_RejoinPersons.ECL:
IMPORT $,Std;
$.File_Persons.Layout Bulkup($.File_Persons_Slim.Layout L,
 $.File_LookupCSZ.Layout R) := TRANSFORM
 SELF.zipcode := IF(R.zipcode=0,'',INTFORMAT(R.zipcode,5,1));
 SELF.FileDate := IF(L.FileDate=0,'',(STRING8)L.FileDate);
 SELF.BirthDate := IF(L.BirthDate=0,'',(STRING8)L.BirthDate);
 SELF.MaritalStatus := '';
 SELF.DependentCount := 0;
 SELF.FirstName := Std.Str.ToTitleCase(L.FirstName);
 SELF.LastName:= Std.Str.ToTitleCase(L.LastName);
 SELF.MiddleName := Std.Str.ToTitleCase(L.MiddleName);
 SELF.NameSuffix := Std.Str.ToTitleCase(L.NameSuffix);
 SELF := R;
 SELF := L;
END;
BulkRecs := JOIN($.File_Persons_Slim.File,
 $.File_LookupCSZ.File,
 LEFT.CSZ_ID=RIGHT.CSZ_ID,
 Bulkup(LEFT,RIGHT),LEFT OUTER,LOOKUP);
OUTPUT(BulkRecs,,'~CLASS::BMF::OUT::Persons_Rejoined',overwrite);
O objetivo deste exercício é recriar exatamente o arquivo Persons original que foi definido no Exercício 2, juntando
o File_Persons_Slim e o File_LookupCSZ. Além de formatar corretamente as datas e o zip code, a função TRANS-
FORM Bulkup também precisa manipular os dois campos "não preenchidos" que não foram executados. Além disso,
restauramos os campos de nome para capitalização apenas de título e usando a biblioteca de funções de string ToTi-
tleCase. Este é um ótimo uso de funções em um TRANSFORM para obter o resultado desejado.
© 2020 HPCC Systems. All rights reserved
102
Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
Soluções para exercícios de laboratório
Exercício 7c
Solução - BWR_RejoinPersonsCompare.ECL:
IMPORT $;
//DATASETS of renormed tables created in Exercise 7B
RJPersons := DATASET('~CLASS::BMF::OUT::Persons_Rejoined',$.File_Persons.Layout,THOR);
//SORT the APPENDed records, and then DEDUP.
AppendRecs := $.File_Persons.File + RJPersons;
SortRecs := SORT(AppendRecs,WHOLE RECORD);
DedupPersons := DEDUP(SortRecs,WHOLE RECORD);
//Count of rejoined records created in Exercise 7B
OUTPUT(COUNT(RJPersons),NAMED('Input_Recs_Persons'));
//This result should be zero
OUTPUT(COUNT(DedupPersons)-count(RJPersons),NAMED('Dup_Persons'));
O objetivo deste exercício é comparar a "rejoined table" no Exercício 7B com o arquivo Persons original que aplicamos
no início deste curso. Usando o operador de acréscimo (+), primeiro combinamos os dois arquivos. Em seguida,
classificamos a tabela anexada por todos os campos no layout Persons, usando a cláusula WHOLE RECORD para
simplificar nosso código. Finalmente, DEDUPlicamos a tabela anexada (novamente usando WHOLE RECORD para
comparar nossos pares) e a contagem de nosso resultado DEDUP deve ser igual à contagem de nosso registro reunido,
que resulta em zero duplicidades.
© 2020 HPCC Systems. All rights reserved
103
	Manual de Treinamento de Introdução ao ECL (Parte 2) - ETL com ECL
	Table of Contents
	Visão Geral
	Introdução
	O que é THOR?
	Visão Geral do Processo ETL
	ECL em ETL - 4 Objetivos Principais
	Convenções de Documentação
	Linguagem ECL
	Nomes
	Código de Exemplo
	Ações
	Trechos da Linguagem ECL
	Definir e organizar seus dados
	Exercício 1: Organize suas definições de dados
	Especificação do exercício:
	Requisitos:
	Comparação do resultado
	Relatórios de tabulação
	TABLE
	Relatórios Cross-Tab
	Uma CrossTab Simples
	Um exemplo mais complexo
	Um Exemplo Estatístico
	Exemplo de tabulação funcional
	Relatórios de tabulação
	Exercício 2a
	Especificação do exercício:
	Requisitos:
	Melhores práticas
	Comparação do resultado
	Exercício 2b
	Especificação do exercício:
	Requisitos:
	Melhores práticas
	Comparação do resultado
	Mais relatórios de avaliação de dados
	DISTRIBUTE "Randômico"
	“Random” DISTRIBUTE
	Expressão DISTRIBUTE
	DISTRIBUTE baseado em Index
	DISTRIBUTE baseado em Skew
	HASH32
	Exercício 3a
	Especificação do exercício:
	Requisitos:
	Melhores práticas
	Comparação do resultado
	Exercício 3b
	Especificação do exercício:
	Requisitos:
	Melhores práticas
	Comparação do resultado
	Padrões dos Dados
	Instalação
	A FunctionMacro Profile
	Visualização
	Instalação
	Categorias de visualização
	Funções de visualização global (helper)
	Visualizações "ordinais" bidimensionais
	Visualizações "lineares" bidimensionais
	Visualizações multidimensionais
	Método de Visualização Geoespacial
	Método de Visualização Geoespacial
	Início Rápido
	Exercício 3c
	Especificação do exercício:
	Requisitos:
	Melhores práticas
	Comparação do resultado
	Exercício 3d
	Especificação do exercício:
	Requisitos:
	Melhores práticas
	Comparação do resultado
	Transformações simples
	Estrutura TRANSFORM
	Definições dos Atributos de Transformação
	Funções TRANSFORM
	TRANSFORMs em linha
	TRANSFORMs abreviado em linha
	PROJECT
	Requisitos da Função TRANSFORM - PROJECT
	PROJECT - Módulo
	Exemplo funcional de PROJECT
	PROJECT
	Diagrama de exemplo funcional do PROJECT
	ITERATE
	Requerimentos da Função TRANSFORM - ITERATE
	Exemplo funcional ITERATE
	ITERATE
	Diagrama de Exemplo Funcional ITERATE
	PERSIST
	Estrutura SERVICE
	Node
	Nodes
	Exercício 4a
	Especificação do exercício:
	Requisitos:
	Comparação do resultado
	Exercício 4b
	Especificação do exercício:
	Requisitos:
	Comparação do resultado
	Padronização de dados
	SIZEOF
	Exercício 5a
	Especificação do exercício:
	Requisitos:
	Melhores práticas
	Comparação do resultado
	Exercício 5b
	Especificação do exercício:
	Requisitos:
	Melhores práticas
	Comparação do resultado
	Criando tabelas lookup
	ROLLUP
	Requerimentos da Função TRANSFORM - ROLLUP
	Forma 1 do ROLLUP
	Forma 2 do ROLLUP
	Forma 3 do ROLLUP
	Exemplo de ROLLUP funcional
	ROLLUP
	Diagrama de Exemplo Funcional ROLLUP
	Exercício 6a
	Especificação do exercício:
	Requisitos:
	Comparação do resultado
	Exercício 6b
	Especificação do exercício:
	Requisitos:
	Comparação do resultado
	Juntando arquivos
	JOIN
	JOIN em Dois Datasets
	Lógica de Correspondência - JOIN
	Opções
	JOINS KEYEDs
	Lógica do Join
	Requerimentos da Função TRANSFORM - JOIN
	Tipos de Join: Dois DATASETS
	JOIN com Set of Datasets
	Lógica de Correspondência de Registros
	Requisitos de função do TRANSFORM - JOIN setofdatasets
	Tipos de Join: setofdatasets
	Exemplo de JOIN funcional
	JOIN
	Diagrama de exemplo funcional JOIN
	INTFORMAT
	Exercício 7a
	Especificação do exercício:
	Requisitos:
	Comparação do resultado
	Exercício 7b
	Especificação do exercício:
	Requisitos:
	Comparação do resultado
	Exercício 7c
	Especificação do exercício:
	Requisitos:
	Comparação do resultado
	Soluções para exercícios de laboratório
	Exercício 1
	Solução - File_Persons.ECL:
	Exercício 1 (continuação)
	Solução - File_Accounts.ECL:
	Exercício 2a
	Solução - XTAB_Persons_Gender.ECL:
	Exercício 2b
	Solução - XTAB_Accounts_HighCredit_MaxMin.ECL:
	Exercício 3a
	Solução - BWR_Persons_BureauCode_Cardinality:
	Exercício 3b
	Solução - BWR_Persons_DependentCount_Population:
	Exercício 3c
	Solução - BWR_Persons_DP:
	Exercício 3d
	Solução - BWR_StatePopulation:
	Exercício 4a
	Solução - UID_Persons.ECL:
	Exercício 4b
	Solução - UID_Accounts.ECL:
	Exercício 5a
	Solução - STD_Persons.ECL:
	Exercício 5b
	Solução - STD_Accounts.ECL:
	Exercício 6a
	Solução - BWR_Rollup_CSZ.ECL:
	Exercício 6b
	Solução - File_LookupCSZ.ECL:
	Exercício 7a
	Solução - File_Persons_Slim.ECL:
	Exercício 7a (continuação)
	Solução - BWR_File_Persons_Slim.ECL:
	Exercício 7b
	Solução - BWR_RejoinPersons.ECL:
	Exercício 7c
	Solução - BWR_RejoinPersonsCompare.ECL:

Mais conteúdos dessa disciplina