最近社区Github最火的issue #8542
"添加 Python 脚本工具进行Transform" —— 这个被疯狂+1的需求值得被更多大神知道!现在正是参与贡献的最佳时机,你的代码可能就出现在下个正式版本中!
issue链接:https://github.com/apache/seatunnel/issues/8542
本Issue由社区 PMC @liugddx
提出,目前处于讨论阶段,想参与的请下滑查看详情!
这个功能到底要做什么?
🐍 Python党的福音
在Apache SeaTunnel里 添加 Python 脚本工具进行Transform
来自社区@FuYouJ的提案
🔌 技术方案预览
当前采用Py4J实现Java-Python双行道:原理如下,支持Java
和Python
客户端双向通信,
实现如下需求:
启动进程
SeaTunnel Transform启动时,Java端会启动一个常驻进程,代码如下
GatewayServer gatewayServer = new GatewayServer(new ExampleJava());
gatewayServer.start();
ExampleJava
提供了以下基本 SeatunnelRow
操作的封装。
启动服务器
现在已经启动了一个 Java 服务器,接下来需要启动一个 Python 客户端来连接 Java 服务器
gateway = JavaGateway(
callback_server_parameters=CallbackServerParameters()
)
# 获取 Java 对象 其实就是ExampleJava2
java_app = gateway.entry_point
如何在Java中执行Python代码?
假设在 Java 端有一个getPython()
方法,提供用户配置的 Python 代码
public String getPythonCode(){
return "import numpy as np;\n" +
"print(np.array([1, 2, 3]));print(\"[Python] 这是 Java 传入的代码!java_app.callPythonMethod(1, 1.1)\");java_app.callPythonMethod(1, 1.1)";
}
# 在python 处申明java对象
java_list = gateway.jvm.java.util.ArrayList()
java_list.append(1)
java_list.append(2)
java_app.addList(1,java_list)
# 在python 处申明java对象
my_object = gateway.jvm.com.example.MyObject("test", 123)
java_app.addObject(1,my_object);
try:
## 执行 java段给定的自定义代码
exec(java_app.getPythonCode()) # 动态执行 Python 代码
except Exception as e:
print(f"[Python] 代码执行出错: {e}")
流程图如下
相关代码
由于代码篇幅过长,可直接访问issue
链接查看。
参与指南
手把手教你如何提交一个PR:
(进入贡献群加小助手微信:seatunnel1)
认领任务
参与讨论获取适合你的专属任务
大佬直通车
跟随社区大佬开始搞事!
如果你对这个功能非常感兴趣,参与讨论认领任务吧?现在加入,你就是这个功能的联合创始人!😄
本文由 白鲸开源科技 提供发布支持!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。