¿Cómo escribo una función de ventana personalizada para Presto?

Me gustaría crear una función de ventana personalizada que procesa un flujo de dobles y produce un doble de salida por partición. Es obligatorio clasificar los valores. La función Window puede procesar una sola fila en el momento (sin necesidad de mirar detrás/ahead) siempre y cuando pueda mantener un estado interno por partición.

La firma se verá así:

SELECT my_windows_func() OVER (PARTITION BY my_key ORDER BY my_val ASC) AS my_stuff

Ahora, descubrí cómo crear AggreagtionFunctions, ScalarFunctions, pero con WindowFunctions no sé por dónde empezar y no pude encontrar ninguna documentación en línea.

¿Qué interfaz debo implementar para mi maletín? Can Ejecuto a los usuarios para añadir ORDER BY ¿Cláusula cuando lo llaman? ¿Algún código de muestra al que pueda referirme?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por techmaestro


3 Respuestas:

  • La ejecución de las funciones debe ser devuelta io.prestosql.spi.Plugin#getFunctions y ser anotado con @WindowFunctionSignature. El io.prestosql.spi.function.ValueWindowFunction es una base útil para implementar una función de ventana. See https://github.com/trinodb/trino/blob/4fba34f3d94291d5411a5c24bd47fa0213898e51/presto-main/src/main/java/io/prestosql/operator/window/LagFunction.java por ejemplo.

    Respondida el Dec 19, 2020 a las 03:44 - por quantumquasar

    Votos positivos: 0 | Votos negativos: 0

  • Para crear una función de ventana personalizada en Presto, necesitas implementar la interfaz WindowFunction de Presto. Aquí tienes un ejemplo de cómo puedes crear una función de ventana personalizada en Presto:

    java
    import com.facebook.presto.spi.block.BlockBuilder;
    import com.facebook.presto.spi.function.Description;
    import com.facebook.presto.spi.function.WindowFunctionSignature;
    import com.facebook.presto.spi.function.WindowIndex;
    import com.facebook.presto.spi.type.StandardTypes;
    import com.facebook.presto.spi.function.WindowFunction;
    
    import static com.facebook.presto.spi.type.DoubleType.DOUBLE;
    
    @Description("Example custom window function")
    @WindowFunctionSignature("my_windows_func")
    public class MyWindowFunction implements WindowFunction
    {
        @Override
        public StandardTypes getReturnType()
        {
            return StandardTypes.DOUBLE;
        }
    
        @Override
        public void process(WindowIndex windowIndex, BlockBuilder output)
        {
            // Implement your window function logic here
            // You can access the values in the window using windowIndex
            // and write the output to the output BlockBuilder
            // This example function just returns the first value in the window
            if (windowIndex.getPositionCount() > 0) {
                DOUBLE.writeDouble(output, windowIndex.getDouble(0));
            }
        }
    }
    

    En este ejemplo, creamos una clase MyWindowFunction que implementa la interfaz WindowFunction de Presto. Dentro de la función process, puedes agregar la lógica de tu función de ventana personalizada. En este caso, la función simplemente devuelve el primer valor en la ventana.

    Recuerda que debes compilar y empaquetar tu función de ventana personalizada como un archivo JAR para poder usarla en Presto.

    Espero que esta información te sea útil y te ayude a crear tu función de ventana personalizada en Presto. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 20, 2020 a las 03:42 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Interfaz a implementar:

    Para crear una función de ventana personalizada en Presto, debe implementar la interfaz WindowFunctionSupplier.

    Firma del método get:

    java
    public WindowFunction get(WindowFunctionDeclaration declaration)
    

    declaration contiene información sobre la función de ventana, como su nombre, firma y argumento.

    Método WindowFunction:

    El método get devuelve una instancia de WindowFunction, que define el comportamiento de la función de ventana. Esta interfaz tiene los siguientes métodos:

    getType: Devuelve el tipo de datos de salida de la función. getIntermediateType: Devuelve el tipo de datos del estado interno mantenido por la función. createWindowFunctionSession: Crea una nueva sesión de función de ventana que mantiene el estado interno. process: Procesa una fila de entrada y actualiza el estado interno. flush: Devuelve el valor de salida final basado en el estado interno.

    Clasificación de valores:

    Las funciones de ventana en Presto admiten la cláusula ORDER BY, y puede especificar la dirección de clasificación (ascendente o descendente) en la declaración de la función.

    Código de muestra:

    java
    import com.facebook.presto.spi.function.WindowFunction;
    import com.facebook.presto.spi.function.WindowFunctionSupplier;
    import com.facebook.presto.spi.type.DoubleType;
    
    public class MyWindowFunctionSupplier implements WindowFunctionSupplier {
    
        @Override
        public WindowFunction get(WindowFunctionDeclaration declaration) {
            return new WindowFunction() {
    
                @Override
                public Type getType() {
                    return DoubleType.DOUBLE;
                }
    
                @Override
                public Type getIntermediateType() {
                    return DoubleType.DOUBLE;
                }
    
                @Override
                public WindowFunctionSession createWindowFunctionSession(WindowIndex windowIndex) {
                    return new MyWindowFunctionSession();
                }
    
                private class MyWindowFunctionSession implements WindowFunctionSession {
    
                    private double currentValue;
    
                    @Override
                    public void processRow(WindowIndex windowIndex, Block row) {
                        // Actualizar el estado interno con el valor actual
                        currentValue = row.getDouble(0);
                    }
    
                    @Override
                    public void finishPartition() {
                        // No es necesario hacer nada aquí
                    }
    
                    @Override
                    public Object flush() {
                        // Devolver el valor de salida final
                        return currentValue;
                    }
                }
            };
        }
    }
    

    Uso:

    Una vez implementada la función de ventana, puede usarla en una consulta de Presto de la siguiente manera:

    
    SELECT my_windows_func() OVER (PARTITION BY my_key ORDER BY my_val ASC) AS my_stuff
    FROM my_table
    

    Nota:

    Deberá registrar su función de ventana personalizada en el catálogo de Presto para que esté disponible para su uso en las consultas. Consulte la documentación de Presto para obtener más información sobre cómo registrar funciones personalizadas.

    Respondida el Dec 20, 2020 a las 03:49 - por Gemini

    Votos positivos: 0 | Votos negativos: 0