Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PYSPARK
✓ Anthony Cachay
V.1.0 01/10/2021 Lineamientos base Max Morales
✓ Erick Salazar
✓ Anthony Cachay
V.1.1 11/01/2022 Parametria Max Morales
✓ Erick Salazar
ÍNDICE Pág.
1. Prefacio ............................................................................................................................... 5
2. Formatos para desarrollo PySpark.............................................................................. 6
3.1. FORMATO FDP01 – Flujo de desarrollo ................................................................. 6
3.2. FORMATO PDP02 – Testing ...................................................................................... 6
3. Jerarquía de desarrollo................................................................................................... 6
4.1. Estructura de carpetas ................................................................................................ 6
4.2 Archivos de configuración ........................................................................................ 12
4.3. Formatos permitidos ................................................................................................. 12
4.4. Tamaño de archivos .................................................................................................. 13
4. Logging ............................................................................................................................. 13
5.1. Criterios básicos......................................................................................................... 13
a) Instanciar la clase Logger .................................................................................... 13
b) No enviar correos electrónicos. ......................................................................... 13
c) Estándar básico de configuración logging. .................................................... 13
d) Métodos permitidos para registro log4j. .......................................................... 14
5.2. Seguridad de logging. ............................................................................................... 14
5. Testing............................................................................................................................... 18
6.1. Pruebas unitarias. ...................................................................................................... 18
a) Reducir datos de prueba al mínimo necesario............................................... 18
b) Consideraciones para la realización de pruebas unitarias ......................... 18
6. Clean Code ....................................................................................................................... 20
7.1. Reglas generales ........................................................................................................ 20
a) Seguir la convención estándar .............................................................................. 20
b) Mantener simple el desarrollo................................................................................ 20
7.2. Reglas de diseño. ....................................................................................................... 22
a) Mantener los datos de configuración en alto nivel .......................................... 22
b) Priorizar el polimorfismo antes que la estructura if/else ................................ 22
7.3. Reglas de nombres. ................................................................................................... 22
a) Utilizar nombres descriptivos ............................................................................. 22
b) Módulos y paquetes .............................................................................................. 23
c) Variables y propiedades ....................................................................................... 23
d) Funciones y métodos ............................................................................................ 25
e) Clases ........................................................................................................................ 26
f) Evitar nombres genéricos. ................................................................................... 26
g) Mantener la consistencia. .................................................................................... 27
h) Utilizar nombres pronunciables. ........................................................................ 27
i) Reemplazar los números mágicos .................................................................... 27
j) Evitar las codificaciones. ..................................................................................... 27
7.4. Reglas de funciones y métodos ............................................................................. 27
a) Utilizar nombres descriptivos ................................................................................ 27
b) Mantener las funciones pequeñas ........................................................................ 27
c) Las funciones deben hacer una sola cosa ......................................................... 28
d) No usar argumentos bandera................................................................................. 28
7.5. Reglas de comentarios ............................................................................................. 29
a) Evitar la redundancia en los comentarios .......................................................... 29
b) Si el código es complejo agregar ejemplos de uso ......................................... 29
c) Agregar advertencias ............................................................................................... 29
d) Los argumentos de los métodos deben describirse ....................................... 30
e) La documentación de código está permitida en español o en inglés ......... 30
1. Prefacio
Link FDP01
Link PDP02
3. Jerarquía de desarrollo
4.1. Estructura de carpetas
Para definir la estructura de carpetas de nuestro desarrollo debe estar
implementado de forma modular para garantizar una mantenibilidad a futuro
y tener un orden de trabajo.
A) Source Folder
La jerarquía de carpetas que debe tener nuestro
desarrollo debe comenzar por definir un source
(src), dentro de esta carpeta debe tener una
carpeta main y tests.
a1) README.md
import os
readme = open(
os.path.join(os.path.dirname(__file__), "README.md"),
"r", encoding="utf-8"
)
setup(
name="ARTIFACT_NAME",
version="$version",
author="$empresa",
description="$comentarios",
long_description=readme.read(),
long_description_content_type="text/markdown",
package_dir={
'': 'main'
},
packages=custom_find_packages('src', exclude=["tests"]),
extras_require={
"dev": ["check-manifest"],
"test": ["coverage"]
},
classifiers=[
"Programming Language :: Python :: 3",
"License :: BCP License"
],
python_requires='>=3.6.x',
license="Apache-2.0",
platform="UNIX"
)
readme.close()
Llenar los datos de versión del aplicativo, autor que se debe colocar el
nombre del desarrollador a cargo y la empresa a donde pertenece, en
descripción debe ser un resumen base del aplicativo.
Si se quiere agregar otras configuraciones que no están dentro de este
archivo de configuración se debe conversar con su CL y coordinar con el equipo
de datos.
class Transformation(Joins):
"""
Template to do transformation
"""
example_df = self._reader.read(self._table_input)
pass
app_job.py Cuarto, dentro de la misma línea del módulo se creará el Job que
permite integrar y correr el proceso.
_sys = __import__("sys")
def main():
args = _sys.argv
Config.SPARK_CONFIG_NAME = '$SPARK_CONFIG_NAME'
Config.PROCESS_CONFIG_NAME = '$PROCESS_CONFIG_NAME'
Main().run_process(args, Transformation)
Se debe importar la clase Main y Config del arquetipo para que este le
permita inyectar nuestras transformaciones hechas en nuestro aplicativo.
A la clase Config se debe sobrescribir las variables de los nombres de los
json de la parametría de spark y configuración del proceso.
B) Scripts Folder
En este folder se debe colocar nuestras
DML del proyecto a ejecutar en los tres
ambientes.
✓ Parquet
✓ Avro
✓ Csv
✓ Txt
✓ Otros*
* Cualquier otro formato que no este dentro de esta lista se sebe coordinar
con el equipo de datos.
4.4. Tamaño de archivos
El tamaño de archivos permitidos para realizar pruebas a nivel local no debe
supera 5Mb de información.
4. Logging
5.1. Criterios básicos
a) Instanciar la clase Logger
Podemos usar el componente de Logger, importando la clase:
Logger().logger.info("testing")
* Para usar la clase logger es importante que antes se haya definido la sesión de
Spark
▪ logger.info(message)
▪ logger.warn(message)
▪ logger.error(message)
▪ logger.debug(message)
1. Atributos de eventos.
“Cuándo”:
“Dónde”:
Ejemplo:
2021-10-13 09:25:16 DEBUG < TEST >: ADMIN: Listener Metrics: {'task_number': '1', 'output_size_bytes': '2198', 'rows_number': '3'}
RDV:
<AMBIENTE>/<ORGANIZACION>/LOG
UDV/DDV/EDV
<AMBIENTE>/<ORGANIZACION>/<CAPA>/<UNIDAD>/<PROYECTO>/LOG
Se recomienda usar el desarrollo guiado por pruebas o TDD por sus siglas
en inglés (Test Driven Development) es un proceso que da las pautas para
el desarrollo de pruebas en el código de producción.
def test_join_moneda_cuenta(transformation):
dummy_data = [
Row(
codmoneda="1001",
codproducto="FCTCBT",
fecvcto=datetime(2017, 4, 27),
nbrmoneda="DOLAR AMERICANO EE.UU",
fecrutina=datetime(2021, 2, 13)
)
]
dummy_df = SparkEntryPoint().spark.createDataFrame(dummy_data)
dummy_cols = dummy.schema.names
result = transformation._Transformation__join_moneda_cuenta(
transformation._Transformation__cuenta_df,
transformation._Transformation__moneda_df
)
_sum = lambda i: i + 1
Tipo Estándar
Constantes UPPER_SNAKE_CASE
Variables lower_snake_case
Funciones lower_snake_case
Clases UpperCamelCase
Módulos lower_snake_case
Paquetes lower_snake_case
b) Módulos y paquetes
Los módulos deben tener nombres cortos y en minúsculas. Se pueden
usar guiones bajos en el nombre del módulo si esto mejora la legibilidad.
Los paquetes en Python también deben tener nombres cortos en
minúsculas, aunque no es recomendable el uso de guiones bajos.
c) Variables y propiedades
Las variables y propiedades normalmente deben recibir un sustantivo
como nombre, que indique qué tipo de dato está almacenando.
d) Funciones y métodos
Las funciones y métodos realizan tareas y operaciones, por lo tanto,
normalmente deben recibir un verbo como nombre.
Se debe evitar utilizar nombres como: email(), user(), etc. Estos nombres
pueden confundirse como variables, en su lugar es mejor utilizar
get_email(), etc.
e) Clases
A menos que se trate de clases estáticas, estas se utilizan para crear
objetos, por lo tanto, el nombre debe describir qué clase de objeto se está
creando. Incluso para clases estáticas, se usará como una especie de
contenedor de datos y funciones, por lo que también se debe describir su
contenido. Al igual que en el caso de las variables y propiedades, las
clases deben recibir un sustantivo como nombre.
Ejemplo: Para obtener los nombres de los clientes se puede crear una
función llamada get_customer_names
Las funciones o métodos deben hacer solo una cosa y hacerla bien. No
deben tener efectos secundarios, hacen lo que se espera que hagan, y
nada más. De cumplir dos tareas, se puede separar en dos métodos o
funciones.
class Concert:
def book(self, is_premium: bool) -> None:
if is_premium:
pass
# continue code
En lugar de usar el argumento bandera, es preferible separar el método
anterior en dos métodos:
class Concert:
def book_regular_book(customer) -> None:
pass
# continue code
c) Agregar advertencias
En algunos casos puede tener sentido agregar advertencias en el código,
por ejemplo:
def setup() -> None:
"""
:WARNING La clase HiveStorage cambiará por HadoopStorage
"""
HiveStorage().setItem('path')