Retour au blog
TutorialMay 2, 202210 min

Maldito ese infierno de formatos de datos

Manejar formatos de datos complejos y cambios puede ser desalentador. Aprende cómo layline.io aborda este desafío utilizando un lenguaje de gramática configurable.

Maldito ese infierno de formatos de datos

Configuración

Eres la persona encargada de gestionar y operar la infraestructura de procesamiento de datos en ACME Corp. Esa maquinaria compleja y delicada que realiza todo el trabajo pesado de datos en tu empresa, pero que nunca recibe el reconocimiento que merece. Es la bomba que no puede dejar de bombear, es el motor que mantiene todo en marcha.

Sin embargo, cuando tus padres, amigos e incluso colegas te preguntan qué haces en ACME, se quedan dormidos a mitad de tu entusiasta explicación.

Seamos sinceros: no recibes suficiente crédito por lo que haces por el mundo 🙃

Desafíos

El trabajo que realizas no requiere que corras con un mono de mecánico, pero ciertamente parece que tienes que observar, reparar, corregir y simplemente inyectar nueva energía en esa infraestructura de procesamiento de datos.

Aunque hay muchos desafíos diarios, uno de ellos tiene que ver con el CAMBIO. Sí, nunca cambies un sistema que está funcionando, dicen, pero así no es como funciona el mundo. Uno de los cambios más frecuentes es …

Cambio en el Formato de Datos

¡AAHHHH! Alerta roja … ¡sirenas sonando …! Cuando se trata de un cambio en el formato de datos, a menudo te enfrentas a varios desafíos al mismo tiempo:

  1. Las interfaces de datos a menudo están codificadas en algún código fuente. No puedes simplemente "cambiarlas" (como sugiere el jefe), o al menos no es tan simple.
  2. Durante la migración, los datos se reciben tanto en el formato antiguo como en el nuevo. Incluso con un pequeño cambio, eso sigue siendo dos formatos diferentes que deben procesarse en paralelo.
  3. No se trata solo de otro campo. A veces es toda una estructura de datos adicional y un montón de otras cosas al mismo tiempo.
  4. Los datos cambiados pueden requerir un manejo interno de información adicional, etc. Nuevamente, las cosas pueden estar codificadas y, por lo tanto, el código necesita cambiar para adaptarse.
  5. Te quedaste sin café. Eso no ayuda.

Aquí tenemos dos problemas principales:

  1. Cambio de código y
  2. manejo de la migración de formatos.

Esto puede convertirse en un gran dolor de cabeza y requerir largos ciclos de planificación, desarrollo, lanzamiento, pruebas y finalmente implementación.

Si tan solo existiera una mejor manera de hacer esto de forma rápida y sencilla ...

Formatos de Datos Genéricos al Rescate

layline.io ofrece Formatos de Datos Genéricos que no pueden resolver todos los desafíos mencionados, pero sí la mayoría de ellos, la mayor parte del tiempo.

¿Qué son los Formatos de Datos Genéricos?

Como su nombre lo indica, este concepto permite definir formatos de datos de manera genérica. Para hacerlo, proporciona:

  1. un lenguaje para definir la estructura (gramática) del formato que estás intentando manejar.
  2. Este lenguaje utiliza expresiones regulares para definir e identificar elementos individuales de una estructura y luego
  3. subelementos de esa estructura, etc.
  4. Es orientado a objetos en el sentido de que puedes definir y reutilizar estructuras de elementos en todo momento.

¿Cómo es ese lenguaje?

Veamos un ejemplo. Para este propósito, trabajaremos con un formato de datos súper simple, que tiene valores separados por comas, debe tener un registro de encabezado, de 1 a n registros de detalle y un registro de cierre.

Ejemplo de datos de un registro simple de transacciones bancarias:

H;Sample Bank Transactions
D;20-Aug-2021;NEFT;23237.00;00.00;37243.31
D;21-Aug-2021;NEFT;00.00;3724.33;33518.98
T;100

Y aquí está cómo se define este formato dentro de layline.io utilizando el lenguaje de gramática genérica:

format {
  name = "Bank Transactions" 
  description = "Random bank transactions"

  start-element = "File"
  target-namespace = "BankIn"

  elements = [
    // Secuencia de archivo
    {
      name = "File"
      type = "Sequence"
      references = [
        { name = "Header", referenced-element = "Header" },
        { name = "Details", max-occurs = "unlimited", referenced-element = "Detail" },
        { name = "Trailer", referenced-element = "Trailer" }
      ]
    },
    // Registro de encabezado
    {
      name = "Header"
      type = "Separated"
      regular-expression = "H"
      separator-regular-expression = ";"
      separator = ";"
      terminator-regular-expression = "\n"
      terminator = "\n"
      mapping = { message = "Header", element = "BT_IN" }
      parts = [
        { name = "RECORD_TYPE", type = "RegExpr", regular-expression = "[^;\n]*", value.type = "Text.String" },
        { name = "FILENAME", type = "RegExpr", regular-expression = "[^;\n]*", value.type = "Text.String" }
      ]
    },
    // Registro de detalle
    {
      name = "Detail"
      type = "Separated"
      // ... estructura similar
    },
    // Registro de cierre
    {
      name = "Trailer"
      type = "Separated"
      // ... estructura similar
    }
  ]
}

El elemento format

Todo comienza con el elemento de nivel superior format:

Además de un name y una description, también tiene un arreglo de elements. Estos elementos definen una serie de subelementos (clases), que pueden ser de diferentes tipos.

El elemento File de tipo Sequence

Este elemento define una estructura lógica de subelementos en su estructura references:

Podrás notar que estamos construyendo un árbol aquí:

Conclusión preliminar

Hemos aprendido que la forma en que funciona el lenguaje de gramática es la siguiente:

  1. Una gramática consiste en una serie de elementos.
  2. Estos elementos vienen en diferentes tipos que cumplen propósitos distintos.
  3. El elemento inicial es format, que apunta a un elemento de inicio.
  4. Puedes definir cualquier cantidad de elementos adicionales.
  5. Algunos elementos pueden hacer referencia a otros elementos.

¿Qué hay de otros formatos más complejos?

Esto es lo que también funciona:

  • Formatos ASCII/Unicode muy complejos
  • Análisis de datos condicional mediante la gestión del estado del analizador condicional
  • Estructuras binarias
  • Una mezcla de formatos ASCII y binarios

Creemos que esto cubre más del 80% de todos los formatos de intercambio de datos.

Soporte para Múltiples Formatos

Puedes definir tantos formatos como desees. layline.io compila todos ellos en un "superformato" en tiempo de ejecución. Esto te permite:

  • Referenciar todos los formatos desde cualquier lugar.
  • Mapear datos de un formato a otro.
  • Crear nuevas instancias de mensajes basadas en un formato específico.
  • Ingerir o exportar datos en cualquiera de los formatos definidos.

¿Dónde configuro todo esto?

Hemos proporcionado una interfaz de usuario agradable para ayudarte a realizar toda la configuración. Puedes encontrarla en el Configuration Center basado en web de layline.io en Project --> Formats --> Generic Format:

Y no se detiene ahí. Mientras defines tu gramática, puedes cargar un archivo de datos de muestra y ver lado a lado si tu gramática coincide con la estructura del archivo de datos:

¿Bastante genial, no?

Referencia de Datos dentro de la Lógica

Una vez que hayas definido una o más gramáticas dentro de layline.io, puedes acceder a elementos y estructuras individuales dentro de ellas:

Ejemplo: Acceso a Datos dentro de Mapping Asset

Ejemplo: Acceso a Datos dentro de Javascript Asset

Cómo Manejar Cambios en los Formatos

Volviendo a los desafíos de los que hablamos al principio, ahora debería estar más claro lo fácil que es adaptarse a los cambios en los formatos.

  • ¿Necesitas otro campo? Solo agrégalo a la gramática.
  • ¿Necesitas toda una nueva estructura de registro? Nuevamente, solo agrégala a la gramática.
  • ¿Necesitas acomodar una versión antigua y una nueva de un registro de Detalle al mismo tiempo? Fácil: puedes insertar un elemento Choice para permitir tanto una versión Detail-Old como una Detail-New.
  • ¿Necesitas calcular contenido basado en otro contenido? Simplemente agrega fórmulas.

Todo está resuelto.

Recursos

#Descripción
1Documentación: Introducción
2Documentación: Generic Format Asset
3Proyecto de ejemplo: Output to Kafka
Share:

Enjoyed this article?

Subscribe to get more insights delivered to your inbox.