最近社区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双行道:原理如下,支持JavaPython客户端双向通信,
实现如下需求:

启动进程

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)

认领任务

参与讨论获取适合你的专属任务

大佬直通车

跟随社区大佬开始搞事!

如果你对这个功能非常感兴趣,参与讨论认领任务吧?现在加入,你就是这个功能的联合创始人!😄

本文由 白鲸开源科技 提供发布支持!

SeaTunnel
77 声望19 粉丝

Apache SeaTunnel是下一代高性能、分布式、海量数据集成框架。通过我们的努力让数据同步更简单,更高效,大幅减少学习成本,加快分布式数据处理能力在生产环境落地。