Durante la última década, el crecimiento y el éxito del aprendizaje automático han sido fenomenales, impulsados principalmente por la disponibilidad de grandes cantidades de datos y poder computacional avanzado. Este aumento fue provocado por la digitalización de varios sectores, lo que condujo a una explosión de datos digitales, desde publicaciones en redes sociales hasta transacciones en línea y datos de sensores.
Los avances en las técnicas de aprendizaje automático, particularmente en el aprendizaje profundo, facilitaron el desarrollo de modelos más complejos y versátiles. En consecuencia, las aplicaciones de aprendizaje automático se han vuelto omnipresentes, lo que contribuye a mejorar la eficiencia y las capacidades en numerosos sectores, incluidos la atención médica, las finanzas y el transporte.
Trabajar con estas cantidades masivas de datos basados en eventos y obtener valor de los eventos mismos y su contexto en el tiempo (otros eventos que ocurren cerca) sigue siendo difícil. Hacerlo en tiempo real o en forma de transmisión es aún más difícil. A menudo, debe usar API complejas de bajo nivel o sortear las limitaciones de un lenguaje de consulta de nivel superior diseñado para resolver problemas muy diferentes, como SQL.
Para hacer frente a estos desafíos, presentamos una nueva abstracción para los datos basados en el tiempo, llamados líneas de tiempo. Las líneas de tiempo organizan los datos por tiempo y entidad, ofreciendo una estructura ideal para datos basados en eventos con un modelo mental gráfico e intuitivo. Las líneas de tiempo simplifican el razonamiento sobre el tiempo al alinear su modelo mental con el dominio del problema, lo que le permite concentrarse en qué calcular, en lugar de cómo expresarlo.
En esta publicación, presentamos los cronogramas como una forma natural de organizar datos basados en eventos y extraer valor, directamente y como entradas para el aprendizaje automático y la ingeniería rápida. Profundizamos en el concepto de línea de tiempo, su interacción con almacenes de datos externos (entradas y salidas) y el ciclo de vida de las consultas mediante líneas de tiempo.
Esta publicación es la primera de una serie sobre Kaskada , un motor de procesamiento de eventos de código abierto diseñado en torno a la abstracción de la línea de tiempo. Continuaremos con una explicación de cómo Kaskada crea un lenguaje de consulta temporal expresivo en la abstracción de la línea de tiempo, cómo el modelo de datos de la línea de tiempo permite a Kaskada ejecutar consultas temporales de manera eficiente y, por último, cómo las líneas de tiempo permiten que Kaskada se ejecute de manera incremental sobre flujos de eventos.
Tratar con una gran variedad de eventos es difícil cuando se trata cada tipo de evento como una tabla de datos separada y desordenada, la forma en que SQL ve el mundo. Es difícil entender qué motivó a Carla a realizar compras o qué hizo que Aaron se relacionara con otros usuarios a través de mensajes.
Al organizar los datos, por tiempo y usuario, se vuelve mucho más fácil detectar patrones. Aaron envía mensajes después de ganar. Carla hace compras cuando se siente frustrada por una serie de pérdidas. También vemos que Brad puede haber dejado de jugar.
Al organizar los datos, por tiempo y usuario, se vuelve mucho más fácil detectar patrones. Aaron envía mensajes después de ganar. Carla hace compras cuando se siente frustrada por una serie de pérdidas. También vemos que Brad podría haber dejado de jugar.
Al organizar los eventos de forma natural, por tiempo y usuario, pudimos identificar patrones. Esta misma organización nos permite expresar valores de características calculados a partir de los eventos y usarlos para entrenar y aplicar modelos de aprendizaje automático o calcular valores para usar dentro de un indicador.
Razonar sobre el tiempo, por ejemplo, causa y efecto entre eventos, requiere más que un conjunto desordenado de datos de eventos. Para consultas temporales, necesitamos incluir el tiempo como una parte de primera clase de la abstracción. Esto permite razonar sobre cuándo ocurrió un evento y el orden, y el tiempo, entre eventos.
Kaskada se basa en la abstracción de la línea de tiempo: un conjunto múltiple ordenado por tiempo y agrupado por entidad. Las líneas de tiempo tienen una visualización natural, como se muestra a continuación. El tiempo se muestra en el eje x y los valores correspondientes en el eje y. Considere comprar eventos de dos personas: Ben y Davor. Estos se muestran como puntos discretos que reflejan el tiempo y el monto de la compra. Llamamos a estas líneas de tiempo discretas porque representan puntos discretos.
El eje de tiempo de una línea de tiempo refleja el tiempo del resultado de un cálculo. Por ejemplo, en cualquier momento podemos preguntar "¿cuál es la suma de todas las compras?" Las agregaciones a lo largo de las líneas de tiempo son acumulativas: a medida que se observan los eventos, la respuesta a la pregunta cambia. Llamamos a estas líneas de tiempo continuas porque cada valor continúa hasta el siguiente cambio.
En comparación con SQL, las líneas de tiempo introducen dos requisitos: ordenar por tiempo y agrupar por entidad. Si bien la relación SQL, un conjunto múltiple o bolsa desordenada, es útil para datos desordenados, los requisitos adicionales de las escalas de tiempo las hacen ideales para razonar sobre causa y efecto. Las líneas de tiempo son para los datos temporales lo que las relaciones son para los datos estáticos.
Agregar estos requisitos significa que los plazos no son adecuados para todas las tareas de procesamiento de datos. En cambio, permiten que las escalas de tiempo se ajusten mejor a las tareas de procesamiento de datos que funcionan con eventos y tiempo. De hecho, la mayoría de los flujos de eventos (p. ej., Apache Kafka, Apache Pulsar, AWS Kinesis, etc.) brindan ordenación y partición por clave.
Al pensar en eventos y tiempo, es probable que ya te imagines algo como una línea de tiempo. Al coincidir con la forma en que ya piensa sobre el tiempo, las líneas de tiempo simplifican el razonamiento sobre los eventos y el tiempo. Al incorporar los requisitos de tiempo y orden, la abstracción de la línea de tiempo permite que las consultas temporales expresen de manera intuitiva la causa y el efecto.
Las líneas de tiempo son la abstracción utilizada en Kaskada para crear consultas temporales, pero los datos comienzan y terminan fuera de Kaskada. Es importante comprender el flujo de datos desde la entrada, hasta las líneas de tiempo y, finalmente, hasta la salida.
Cada consulta parte de una o más fuentes de datos de entrada. Cada entrada, ya sean eventos que llegan en un flujo o se almacenan en una tabla, o hechos almacenados en una tabla, se pueden convertir en una línea de tiempo sin perder un contexto importante, como la hora de cada evento.
La consulta en sí se expresa como una secuencia de operaciones. Cada operación crea una línea de tiempo a partir de líneas de tiempo. El resultado de la operación final se utiliza como resultado de la consulta. Por lo tanto, la consulta produce una línea de tiempo que puede ser discreta o continua.
El resultado de una consulta es una línea de tiempo, que puede enviarse a un sumidero. Las filas escritas en el receptor pueden ser un historial que refleje los cambios dentro de una línea de tiempo o una instantánea que refleje los valores en un momento específico.
Antes de realizar una consulta, cada entrada se asigna a una línea de tiempo. Cada entrada, ya sean eventos de un flujo o tabla o hechos en una tabla, se puede asignar a una línea de tiempo sin perder la información temporal importante, como cuándo ocurrieron los eventos. Los eventos se convierten en líneas de tiempo discretas, con los valores de cada evento que ocurren en el momento del evento. Los hechos se convierten en líneas de tiempo continuas, que reflejan el tiempo durante el cual se aplicó cada hecho. Al representar sin pérdidas todo tipo de entradas temporales, las escalas de tiempo permiten que las consultas se centren en el cálculo en lugar del tipo de entrada.
Después de ejecutar una consulta, la línea de tiempo resultante debe enviarse a un sistema externo para su consumo. El sumidero de cada destino permite configurar la escritura de datos, con especificidades según el sumidero y el destino (ver
Hay varias opciones para convertir la línea de tiempo en filas de datos, lo que afecta la cantidad de filas producidas:
Un historial completo de cambios ayuda a visualizar o identificar patrones en los valores de los usuarios a lo largo del tiempo. Por el contrario, una instantánea en un momento específico es útil para los paneles en línea o para clasificar usuarios similares.
La inclusión de eventos después de un cierto tiempo reduce el tamaño de la salida cuando el destino ya tiene datos hasta ese momento o cuando los puntos anteriores son irrelevantes. Esto es especialmente útil cuando se vuelve a ejecutar una consulta para materializarla en un almacén de datos.
La inclusión de eventos hasta un momento específico también limita el tamaño de la salida y permite elegir una instantánea de un punto en el tiempo. Con la ejecución incremental, la selección de una hora ligeramente anterior a la hora actual reduce el procesamiento de datos tardío.
Las opciones "cambiado desde" y "actualizado" son especialmente útiles con la ejecución incremental, que discutiremos en un próximo artículo.
El historial, el conjunto de todos los puntos en la línea de tiempo, es útil cuando te importan los puntos pasados. Por ejemplo, esto puede ser necesario para visualizar o identificar patrones en la forma en que los valores de cada usuario cambian con el tiempo. El historial es particularmente útil para generar ejemplos de entrenamiento para usar en la creación de un modelo.
Cualquier línea de tiempo puede generarse como un historial. Para una línea de tiempo discreta, la historia es la colección de eventos en la línea de tiempo. Para una línea de tiempo continua, el historial contiene los puntos en los que cambia un valor; es efectivamente un registro de cambios.
Una instantánea, el valor de cada entidad en un momento específico, es útil cuando solo le interesan los valores más recientes. Por ejemplo, al actualizar un tablero o completar una tienda de funciones para conectarse a la publicación de modelos.
Cualquier línea de tiempo puede generarse como una instantánea. Para una línea de tiempo discreta, la instantánea incluye filas para cada evento que ocurre en ese momento. Para una línea de tiempo continua, la instantánea incluye una fila para cada entidad con el valor de esa entidad en ese momento.
Esta publicación de blog destacó la importancia de las características temporales al crear modelos ML a partir de datos basados en eventos. El tiempo y el contexto temporal de los eventos es fundamental para ver patrones en la actividad. Esta publicación introdujo la abstracción de la línea de tiempo, que permite trabajar con los eventos y el contexto temporal. Las líneas de tiempo organizan los datos por tiempo y entidad, lo que proporciona una estructura más adecuada para los datos basados en eventos en comparación con los conjuntos múltiples.
La abstracción de la línea de tiempo es una progresión natural en el procesamiento de secuencias, lo que le permite razonar sobre el tiempo y las relaciones de causa y efecto de manera más efectiva. También exploramos el flujo de datos en una consulta temporal, desde la entrada hasta la salida, y discutimos las diversas opciones para enviar líneas de tiempo a sistemas externos.
En lugar de aplicar una consulta tabular (estática) a una secuencia de instantáneas, Kaskada opera en el historial (el flujo de cambios). Esto hace que sea natural operar en el tiempo entre instantáneas, en lugar de solo en los datos contenidos en la instantánea. El uso de líneas de tiempo como abstracción principal simplifica el trabajo con datos basados en eventos y permite transiciones fluidas entre secuencias y tablas.
Puede
Por Ben Chambers y Therapon Skoteiniotis, DataStax