PythonCallableAsResult.yql 904 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. (
  2. (let config (DataSource 'config))
  3. (let world (Configure! world config 'PureDataSource 'yt))
  4. # prepare python udf
  5. (let ui64 (DataType 'Uint64))
  6. (let str (DataType 'String))
  7. (let funcType (CallableType '() '(ui64) '(ui64)))
  8. (let udfType (CallableType '() '(funcType) '(ui64)))
  9. (let udfScript (String '@@
  10. def create_counter(start):
  11. def counter(step):
  12. v = counter.x
  13. counter.x += step
  14. return v
  15. counter.x = start
  16. return counter
  17. @@))
  18. (let udf (ScriptUdf 'Python 'create_counter udfType udfScript))
  19. # call udf
  20. (let counter (Apply udf (Uint64 '1)))
  21. (let result (AsList
  22. (Apply counter (Uint64 '1))
  23. (Apply counter (Uint64 '2))
  24. (Apply counter (Uint64 '3))
  25. (Apply counter (Uint64 '4))
  26. ))
  27. # output result with type
  28. (let res_sink (DataSink 'result))
  29. (let world (Write! world res_sink (Key) result '( '('type) )))
  30. # finish
  31. (return (Commit! world res_sink))
  32. )