¿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
. Elio.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 interfazWindowFunction
de Presto. Dentro de la funciónprocess
, 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 deWindowFunction
, 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