詳細検索

Ações, Transformações Estreitas e Transformações Amplas

Avatar
por Chen Ziyu
4 min de leitura

Ações, Transformações Estreitas e Transformações Amplas
Traduzido do English • Ver original

Oi! Meu nome é Ziyu Chen. Sou engenheira full-stack na Colorkrew. Adoro aprender e escrever sobre engenharia de dados.

Hoje, gostaria de discutir transformações e ações no Spark. Claro, você pode mergulhar no mundo do Spark e realizar processos ETL sem saber como eles diferem uns dos outros. No entanto, uma vez que você está responsável por otimizar processos ETL pré-existentes ou construir novos do zero, não entender suas diferenças pode sabotar a eficiência dos processos ETL que você cria. No final, processos ETL medíocres e ineficientes podem até aumentar o custo operacional da sua organização. Portanto, uma compreensão profunda da essência das transformações e ações torna-se necessária se você quiser construir processos ETL de alto desempenho usando o Spark.

Vamos começar com uma breve introdução às transformações e ações. Transformações são operações Spark que retornam DataFrames, Conjuntos de Dados ou RDDs, que apenas representam os dados reais. Como as transformações geram apenas representações de dados, elas exigem poucos recursos computacionais. Por outro lado, ações são operações Spark que carregam os dados ou os armazenam em armazenamento externo. As ações envolvem extrair e carregar os dados reais, o que as torna mais intensivas em computação do que transformações. Portanto, é melhor evitar usar ações sempre que possível.

Em seguida, vamos ver alguns exemplos. Métodos como map(), filter() e intersection() são transformações. O Map transforma as linhas no DataFrame original e retorna um novo DataFrame com o mesmo número de linhas. Filter retorna um novo DataFrame contendo linhas que correspondem aos critérios. Intersection combina dois DataFrames e retorna um novo DataFrame contendo linhas presentes em ambos os DataFrames de origem. Apesar das diferenças em suas funcionalidades, eles compartilham o mesmo tipo de retorno: DataFrame.

Quanto às ações, temos exemplos como count(), collect() e write(). Count recupera o número de linhas em um DataFrame. Collect retorna todos os dados em um DataFrame. Write salva os dados representados por um DataFrame. Por mais diferentes que sejam, todas envolvem recuperar os dados reais, o que as torna mais demoradas e intensivas em computação do que representações.

img1

Transformações podem ser ainda divididas em duas categorias: transformações estreitas e transformações amplas. Em transformações estreitas, todas as linhas necessárias para calcular as linhas na mesma partição nos dados de saída (representadas pelo DataFrame de saída) vêm da mesma partição nos dados de entrada (representada pelo DataFrame de entrada). Em outras palavras, os registros em uma partição dos dados de entrada contribuem apenas para uma partição nos dados de saída. Portanto, não há necessidade de mover os dados para facilitar a geração de partições nos DataFrames de saída, o que significa que transformações estreitas são rápidas em geral. Alguns exemplos de transformações estreitas incluem map() e filter().

Em transformações largas, entretanto, as linhas necessárias para calcular as linhas na mesma partição nos dados de saída (representadas pelo DataFrame de saída) podem vir de diferentes partições nos dados de entrada (representadas pelo DataFrame de entrada). Em outras palavras, os registros em uma partição dos dados de entrada podem contribuir para múltiplas partições nos dados de saída. Assim, para gerar partições no DataFrame de saída, o Spark pode precisar embaralhar os dados entre diferentes nós ao produzir o DataFrame de saída. Esse embaralhamento de dados requer recursos computacionais extras além do que é exigido pelo processo de transformação e pode retardar todo o processo ETL, especialmente quando o tamanho dos dados é enorme. Portanto, é melhor evitar transformações amplas tanto quanto possível. Algumas das transformações amplas mais comumente usadas incluem groupByKey() e aggregateByKey().

img2

Para resumir, para projetar processos ETL de alto desempenho, é vital que compreendamos plenamente as diferenças entre ações e transformações, bem como entre transformações estreitas e transformações amplas. As ações envolvem extrair e carregar os dados reais, enquanto transformações produzem apenas representações dos dados reais. Portanto, ações são mais intensivas em computação do que transformações e só devem ser incorporadas aos processos ETL quando necessário. Transformações estreitas não envolvem embaralhamento de dados, enquanto transformações amplas envolvem. Assim, o uso excessivo de transformações amplas pode piorar o desempenho do seu processo ETL e deve ser evitado ao máximo.

Desde que você leve essas diferenças em mente ao construir seu processo ETL, um processo ETL totalmente otimizado não é mais um sonho distante. Obrigado por ler este artigo, e espero que seja útil para sua jornada com o Spark.

Related Articles