@@ -5,28 +5,53 @@ and [UDSinks](https://numaflow.numaproj.io/user-guide/sinks/user-defined-sinks/)
55
66## Implement a User Defined Function (UDF)
77
8- ``` python
98
9+ ### Map
10+
11+ ``` python
1012from pynumaflow.function import Messages, Message, Datum, UserDefinedFunctionServicer
1113
1214
13- def function_handler (key : str , datum : Datum) -> Messages:
14- """
15- Simple UDF that relays an incoming message.
16- """
15+ def my_handler (key : str , datum : Datum) -> Messages:
1716 val = datum.value
1817 _ = datum.event_time
1918 _ = datum.watermark
20- messages = Messages(Message(key = key, value = val))
19+ messages = Messages(Message.to_vtx (key, val))
2120 return messages
2221
2322
2423if __name__ == " __main__" :
25- grpc_server = UserDefinedFunctionServicer(function_handler )
24+ grpc_server = UserDefinedFunctionServicer(map_handler = my_handler )
2625 grpc_server.start()
2726```
2827
29- ### Sample Image (TODO)
28+ ### Reduce
29+
30+ ``` python
31+ from typing import Iterator
32+ from pynumaflow.function import Messages, Message, Datum, Metadata, UserDefinedFunctionServicer
33+
34+
35+ def my_handler (key : str , datums : Iterator[Datum], md : Metadata) -> Messages:
36+ interval_window = md.interval_window
37+ counter = 0
38+ for _ in datums:
39+ counter += 1
40+ msg = (
41+ f " counter: { counter} interval_window_start: { interval_window.start} "
42+ f " interval_window_end: { interval_window.end} "
43+ )
44+ return Messages(Message.to_vtx(key, str .encode(msg)))
45+
46+
47+ if __name__ == " __main__" :
48+ grpc_server = UserDefinedFunctionServicer(reduce_handler = my_handler)
49+ grpc_server.start()
50+ ```
51+
52+ ### Sample Image
53+ A sample UDF [ Dockerfile] ( examples/function/forward_message/Dockerfile ) is provided
54+ under [ examples] ( examples/function/forward_message ) .
3055
3156## Implement a User Defined Sink (UDSink)
3257
@@ -35,16 +60,16 @@ from typing import Iterator
3560from pynumaflow.sink import Datum, Responses, Response, UserDefinedSinkServicer
3661
3762
38- def udsink_handler (datums : Iterator[Datum]) -> Responses:
63+ def my_handler (datums : Iterator[Datum]) -> Responses:
3964 responses = Responses()
4065 for msg in datums:
41- print (" User Defined Sink" , msg)
66+ print (" User Defined Sink" , msg.value.decode( " utf-8 " ) )
4267 responses.append(Response.as_success(msg.id))
4368 return responses
4469
4570
4671if __name__ == " __main__" :
47- grpc_server = UserDefinedSinkServicer(udsink_handler )
72+ grpc_server = UserDefinedSinkServicer(my_handler )
4873 grpc_server.start()
4974```
5075
0 commit comments