Cómo implementar un lenguaje de consulta a medida con Python y Apache Spark

Fuentes: Implementing a Custom Query Language with Python and Apache Spark

Este artículo describe, paso a paso, cómo construir un esqueleto funcional de un lenguaje de consulta propio —denominado Entity History Query Language (EHQL)— utilizando Python y la biblioteca de análisis sintáctico Lark, con Apache Spark como motor de ejecución.

EHQL fue diseñado para analistas semitécnicos que trabajan con datos de mantenimiento de vehículos. Spark se eligió como base porque los datos ya se almacenan en formato Parquet y están registrados en un catálogo central, lo que elimina la necesidad de crear un motor de almacenamiento o de consulta desde cero. El objetivo se reduce así a traducir las consultas del lenguaje a expresiones que Spark pueda ejecutar.

El texto recorre las tres fases habituales para implementar un lenguaje: definir la gramática (en EBNF), construir el árbol sintáctico a partir del texto fuente y transformar dicho árbol en la forma final que ejecutará el programa. Se analiza con detalle la gramática mínima de EHQL, que emplea indentación significativa al estilo de Python para agrupar patrones de búsqueda. Se explican los terminales _NEWLINE, _INDENT y _DEDENT, así como el mecanismo de postlex que necesita Lark para gestionar la indentación, ya que los analizadores léxicos tradicionales no mantienen estado.

El artículo justifica la elección de Lark frente a ANTLR por su mayor velocidad, popularidad y conjunto de funcionalidades, y ofrece un ejemplo de subclase Indenter que conecta los terminales de la gramática con el postlex de Lark. Termina con un enlace al código completo y ejecutable de la implementación.