Existem algumas diferenças entre eles e vamos descobrir neste post. O parâmetro mode permite passar como valor, formas de validar Dataframes visando a qualidade dos dados.
Neste post vamos criar um Dataframe utilizando PySpark e comparar as diferenças entre esses três tipos de mode, são eles:
PERMISSIVE
DROPMALFORMED
FAILFAST
Conteúdo do arquivo CSV
Para este post, usaremos como exemplo um arquivo CSV contendo alguns registros variados, dentre eles, registros corrompidos. A definição de registros corrompidos para este contexto é que, para a coluna engines adicionamos alguns registros com tipos diferentes do que serão definidos no esquema.
Neste caso, no esquema, a coluna engines será definida como Integer mas no conteúdo abaixo, temos alguns registro com valores do tipo String.
"type","country","city","engines","first_flight","number_built"
"Airbus A220","Canada","Calgary",2,2013-03-02,179
"Airbus A220","Canada","Calgary","two",2013-03-02,179
"Airbus A220","Canada","Calgary",2,2013-03-02,179
"Airbus A320","France","Lyon","two",1986-06-10,10066
"Airbus A330","France","Lyon","two",1992-01-02,1521
"Boeing 737","USA","New York","two",1967-08-03,10636
"Boeing 737","USA","New York","two",1967-08-03,10636
"Boeing 737","USA","New York",2,1967-08-03,10636
"Airbus A220","Canada","Calgary",2,2013-03-02,179
Vamos começar criando um Dataframe simples que irá carregar dados do arquivo CSV contendo os registros acima, vamos supor que o conteúdo acima seja de um arquivo chamado avioes.csv. Para modelar o conteúdo, também estamos criando um esquema que nos permitirá validar os dados.
Criando um Dataframe usando o mode PERMISSIVE
O mode PERMISSIVE define valores de campos como nulos quando registros corrompidos são detectados para aquela coluna. Por padrão, se você não especificar nenhum valor para o parâmetro mode, Spark definirá o valor PERMISSIVE.
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
if __name__ == "__main__":
spark = SparkSession.builder \
.master("local[1]") \
.appName("spark-app") \
.getOrCreate()
schema = StructType([
StructField("TYPE", StringType()),
StructField("COUNTRY", StringType()),
StructField("CITY", StringType()),
StructField("ENGINES", IntegerType()),
StructField("FIRST_FLIGHT", StringType()),
StructField("NUMBER_BUILT", IntegerType())
])
read_df = spark.read \
.option("header", "true") \
.option("mode", "PERMISSIVE") \
.format("csv") \
.schema(schema) \
.load("airplanes.csv")
read_df.show(10)
Resultado utilizando PERMISSIVE mode
Perceba que para a colune ENGINES que possui registros que não seguem o padrão de tipagem definido, foram convertidas para o valor null.
Criando um Dataframe usando o mode DROPMALFORMED
O mode DROPMALFORMED ignora registros corrompidos. O que significa que, se você escolher este tipo de mode, os registros corrompidos não serão listados.
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
if __name__ == "__main__":
spark = SparkSession.builder \
.master("local[1]") \
.appName("spark-app") \
.getOrCreate()
schema = StructType([
StructField("TYPE", StringType()),
StructField("COUNTRY", StringType()),
StructField("CITY", StringType()),
StructField("ENGINES", IntegerType()),
StructField("FIRST_FLIGHT", StringType()),
StructField("NUMBER_BUILT", IntegerType())
])
read_df = spark.read \
.option("header", "true") \
.option("mode", "DROPMALFORMED") \
.format("csv") \
.schema(schema) \
.load("airplanes.csv")
read_df.show(10)
Resultado utilizando DROPMALFORMED mode
Após definirmos o valor do mode como DROPMALFORMED, perceba que ao listar o registros do Dataframe, os registros corrompidos foram ignorados, não sendo apresentados no Dataframe.
Criando um Dataframe usando o mode FAILFAST
Diferente do mode DROPMALFORMED e PERMISSIVE, FAILFAST lança uma exceção quando detecta registros corrompidos.
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
if __name__ == "__main__":
spark = SparkSession.builder \
.master("local[1]") \
.appName("spark-app") \
.getOrCreate()
schema = StructType([
StructField("TYPE", StringType()),
StructField("COUNTRY", StringType()),
StructField("CITY", StringType()),
StructField("ENGINES", IntegerType()),
StructField("FIRST_FLIGHT", StringType()),
StructField("NUMBER_BUILT", IntegerType())
])
read_df = spark.read \
.option("header", "true") \
.option("mode", "FAILFAST") \
.format("csv") \
.schema(schema) \
.load("airplanes.csv")
read_df.show(10)
Resultado utilizando FAILFAST mode
ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
org.apache.spark.SparkException: Malformed records are detected in record parsing. Parse Mode: FAILFAST. To process malformed records as null result, try setting the option 'mode' as 'PERMISSIVE'.
Material de estudo
Se quer aprender mais sobre o assunto e alcançar um alto nível de conhecimento, recomendo fortemente a leitura do(s) seguinte(s) livro(s):
Spark: The Definitive Guide: Big Data Processing Made Simple (Versão Inglês) é uma referência completa para quem quer aprender o Spark e sobre as suas principais funcionalidades. Lendo esse livro, você vai aprender sobre DataFrames, Spark SQL através de exemplos práticos. O autor mergulha nas APIs de baixo nível do Spark, RDDs e também sobre como o Spark é executado em um cluster e como depurar e monitorar os aplicativos de clusters do Spark. Os exemplos práticos estão em Scala e Python.
Beginning Apache Spark 3: With Dataframe, Spark SQL, Structured Streaming, and Spark Machine Library (Versão Inglês) com a nova versão do Spark, este livro explora os principais recursos do Spark, como o uso de Dataframes, Spark SQL no qual você pode usar SQL para manipular dados e Structured Streaming para processar dados em tempo real. Este livro contém exemplos práticos e trechos de código para facilitar a leitura.
High Performance Spark: Best Practices for Scaling and Optimizing Apache Spark (Versão Inglês) é um livro que explora as melhores práticas usando a linguagem Spark e Scala para lidar com aplicações de dados em larga escala, técnicas para transformações utilizando RDD, e também mostra como as novas interfaces do Spark SQL melhoram o desempenho sobre a estrutura de dados RDD do SQL, exemplos de Spark MLlib e o uso de bibliotecas de aprendizado de máquina de ML e muito mais.
Python Crash Course, 2nd Edition: A Hands-On, Project-Based Introduction to Programming (Versão Inglês)
abrange os conceitos básicos do Python por meio de exemplos interativos e práticas recomendadas.
Learning Scala: Practical Functional Programming for the Jvm (Versão Inglês) é um excelente livro que aborda a linguagem Scala através de exemplos e exercícios práticos. Lendo este livro, você aprenderá sobre os principais tipos de dados, literais, valores e variáveis. Construir classes que compõem uma ou mais características para total reutilização, criar novas funcionalidades misturando-as na instanciação e muito mais. Scala é uma das principais linguagens em projetos de Big Data em todo o mundo, com grande uso em grandes empresas de tecnologia como o Twitter e também a linguagem principal do Spark.
Bom é isso, espero que tenham gostado!
Comments