跨平台移植Python程序的方法和装置与流程

文档序号:12664424阅读:519来源:国知局
跨平台移植Python程序的方法和装置与流程

本发明涉及软件开发技术领域,尤其涉及一种跨平台移植Python程序的方法和装置。



背景技术:

随着软件开发技术的发展,项目开发人员开始引用Spark技术,Spark SQL是Spark技术的核心组件之一。由于Spark SQL本身支持的函数有限,因此推出了用户自定义函数UDF功能,用户可以在Spark SQL里自定义实际需要的UDF来处理数据。Python作为一种面向对象、直译式计算机程序设计语言,因其具有跨平台、公用库多、易开发等优势,应用趋势越来越高。

相关技术中,Spark SQL中并未提供采用Python程序编写UDF的功能,只是提供转换关键字在SQL中调用脚本的功能,即将表中的数据作为Python的标准输入,而后捕捉标准输出。

这种方式下,无法如采用Java程序编写应用程序编程接口,提供满足用户自定义表生成函数UDTF和用户自定义聚合函数UDAF的功能。



技术实现要素:

本发明旨在至少在一定程度上解决相关技术中的技术问题之一。

为此,本发明的一个目的在于提出一种跨平台移植Python程序的方法,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

本发明的另一个目的在于提出一种跨平台移植Python程序的装置。

为达到上述目的,本发明第一方面实施例提出的跨平台移植Python程序的方法,包括:接收用户编写的实现预设函数功能的Python程序;通过Python解析器将所述Python程序解析为Java类,并将所述Java类作为目标Java类;采用Spark框架下实现预设函数功能的Java类调用所述目标Java类,以实现将所述Python程序移植至所述Spark框架下。

在本发明的一个实施例中,在所述采用Spark框架下实现预设函数功能的Java类调用所述目标Java类中,包括:

采用Java程序编写所述Spark框架下实现预设函数功能的Java类;

采用Java反射机制调用所述目标Java类。

在本发明的一个实施例中,在所述通过Python解析器将所述Python程序解析为Java类之前,还包括:

采用Java程序编写所述Python解析器。

在本发明的一个实施例中,在所述接收用户编写的实现预设函数功能的Python程序之前,包括:

采用Python程序编写预设函数的基类,得到实现预设函数功能的Python基类。

在本发明的一个实施例中,还包括:

对所述Python基类、所述Java类、所述Python解析器,以及所述Python程序进行脚本化处理,得到jar包;

在所述Spark框架下运行所述jar包,以实现将所述Python程序移植至所述Spark框架下。

本发明第一方面实施例提出的方法,通过接收用户编写的实现预设函数功能的Python程序,通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类,最后采用Spark框架下实现预设函数功能的Java类调用目标Java类,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

为达到上述目的,本发明第二方面实施例提出的跨平台移植Python程序的装置,包括:接收模块,用于接收用户编写的实现预设函数功能的Python程序;解析模块,用于通过Python解析器将所述Python程序解析为Java类,并将所述Java类作为目标Java类;调用模块,用于采用Spark框架下实现预设函数功能的Java类调用所述目标Java类,以实现将所述Python程序移植至所述Spark框架下。

在本发明的一个实施例中,还包括:

编写子模块,用于采用Java程序编写所述Spark框架下实现预设函数功能的Java类;

调用子模块,用于采用Java反射机制调用所述目标Java类。

在本发明的一个实施例中,还包括:

第一编写模块,用于采用Java程序编写所述Python解析器。

在本发明的一个实施例中,还包括:

第二编写模块,用于采用Python程序编写预设函数的基类,得到实现预设函数功能的Python基类。

在本发明的一个实施例中,还包括:

处理模块,用于对所述Python基类、所述Java类、所述Python解析器,以及所述Python程序进行脚本化处理,得到jar包;

运行模块,用于在所述Spark框架下运行所述jar包,以实现将所述Python程序移植至所述Spark框架下。

本发明第二方面实施例提出的跨平台移植Python程序的装置,通过接收用户编写的实现预设函数功能的Python程序,通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类,最后采用Spark框架下实现预设函数功能的Java类调用目标Java类,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:

图1是本发明一实施例提出的跨平台移植Python程序的方法的流程示意图;

图2是本发明另一实施例提出的跨平台移植Python程序的方法的流程示意图;

图3是本发明另一实施例提出的跨平台移植Python程序的方法的流程示意图;

图4是本发明一实施例提出的跨平台移植Python程序的装置的结构示意图;

图5是本发明另一实施例提出的跨平台移植Python程序的装置的结构示意图。

具体实施方式

下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。相反,本发明的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。

图1是本发明一实施例提出的跨平台移植Python程序的方法的流程示意图,本实施例以该跨平台移植Python程序的方法被配置为跨平台移植Python程序的装置中来举例说明。

参见图1,该跨平台移植Python程序的方法包括:

S11:接收用户编写的实现预设函数功能的Python程序。

随着软件开发技术的发展,项目开发人员开始引用Spark技术,Spark SQL是Spark技术的核心组件之一。由于Spark SQL本身支持的函数有限,因此推出了用户自定义函数UDF功能,用户可以在Spark SQL里自定义实际需要的UDF来处理数据。Python作为一种面向对象、直译式计算机程序设计语言,因其具有跨平台、公用库多、易开发等优势,应用趋势越来越高。

相关技术中,Spark SQL中并未提供采用Python程序编写UDF的功能,只是提供转换关键字在SQL中调用脚本的功能,即将表中的数据作为Python的标准输入,而后捕捉标准输出。这种方式下,无法如采用Java程序编写应用程序编程接口,提供满足用户自定义表生成函数UDTF和用户自定义聚合函数UDAF的功能。

而本发明的实施例中,通过接收用户编写的实现预设函数功能的Python程序,而后通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类,最后采用Spark框架下实现预设函数功能的Java类调用目标Java类,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

在本发明的实施例中,预设函数例如为Spark框架下的用户自定义函数UDF、用户自定义表生成函数UDTF,以及用户自定义聚合函数UDAF。

在本发明的实施例中,可以接收用户基于Python基类编写的实现预设函数功能的Python程序。

首先,可以采用Python程序编写预设函数的基类,得到实现预设函数功能的Python基类,即得到一套Python UDF/UDAF/UDTF基类,而后用户可以基于Python UDF/UDAF/UDTF基类编写实现UDF/UDAF/UDTF功能的Python程序。

可选地,采用Python程序编写预设函数的基类,得到一套Python UDF/UDAF/UDTF基类,相对于采用Java程序编写预设函数的基类,即相对于Java UDF/UDAF/UDTF基类,具有以下优势:

(1)采用Python程序编写预设函数的基类使用预设函数签名声明入参和出参类型检查,能够避免采用Java UDF基类中,需要在初始化函数中创建各种参数检查器的复杂操作。

(2)采用Python程序编写预设函数的基类可以捕获任何异常类型,并展现给用户,无需像采用Java UDF基类一样,需要指定异常的类型。

(3)采用Python程序编写预设函数的基类,提供在用户自定义函数UDF中获取资源的接口。

S12:通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类。

需要说明的是,由于在Spark框架下只能运行Java程序,因此需要将Python程序解析为Java类。

具体地,可以采用Java程序编写Python解析器,而后通过Python解析器将用户基于Python基类编写的实现预设函数功能的Python程序解析为Java类,即,采用Java程序编写与UDF/UDAF/UDTF相关的Python解析器,将用户基于Python UDF/UDAF/UDTF基类编写的实现UDF/UDAF/UDTF功能的Python程序解析转换为Java类,并将Java类作为目标Java类,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,且由于Python程序相对于Java程序更加简洁,能够简化Spark框架下程序的设计。

S13:采用Spark框架下实现预设函数功能的Java类调用目标Java类,以实现将Python程序移植至Spark框架下。

一些实施例中,参见图2,在步骤S13中,还可以包括:

S21:采用Java程序编写Spark框架下实现预设函数功能的Java类。

可选地,采用Java程序编写Spark框架下实现预设函数功能的Java类,即基于采用Java程序编写预设函数的基类(基于Java UDF/UDAF/UDTF基类),编写一套通用的Spark UDF/UDAF/UDTF Java类。

通过采用Java程序编写Spark框架下实现预设函数功能的Java类,以采用Spark框架下实现预设函数功能的Java类调用目标Java类,能够在Spark框架下运行实现预设函数功能的Python程序,实现用户需求的函数的功能,简化Spark框架下程序的设计。

S22:采用Java反射机制调用目标Java类。

可选地,采用Spark框架下实现预设函数功能的Java类调用目标Java类,即在Spark UDF/UDAF/UDTF Java类中,采用Java反射机制调用步骤S12中解析后的包含用户逻辑的Java类,以实现用户需求的预设函数的功能,能够在Spark框架下运行实现预设函数功能的Python程序,实现用户需求的函数的功能,且由于Python程序相对于Java程序更加简洁,能够简化Spark框架下程序的设计。

本实施例中,通过接收用户编写的实现预设函数功能的Python程序,通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类,最后采用Spark框架下实现预设函数功能的Java类调用目标Java类,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

图3为本发明另一实施例提出的跨平台移植Python程序的方法的流程示意图,本实施例以该跨平台移植Python程序的方法被配置为跨平台移植Python程序的装置中来举例说明。

参见图3,该跨平台移植Python程序的方法包括:

S31:采用Python程序编写预设函数的基类,得到实现预设函数功能的Python基类。

在本发明的实施例中,预设函数例如为Spark框架下的用户自定义函数UDF、用户自定义表生成函数UDTF,以及用户自定义聚合函数UDAF。

可选地,采用Python程序编写预设函数的基类,得到一套Python UDF/UDAF/UDTF基类,相对于采用Java程序编写预设函数的基类,即相对于Java UDF/UDAF/UDTF基类,具有以下优势:

1)采用Python程序编写预设函数的基类使用预设函数签名声明入参和出参类型检查,能够避免采用Java UDF基类中,需要在初始化函数中创建各种参数检查器的复杂操作。

2)采用Python程序编写预设函数的基类可以捕获任何异常类型,并展现给用户,无需像采用Java UDF基类一样,需要指定异常的类型。

3)采用Python程序编写预设函数的基类,提供在用户自定义函数UDF中获取资源的接口。

S32:接收用户基于Python基类编写的实现预设函数功能的Python程序。

具体地,在采用Python程序编写预设函数的基类,得到实现预设函数功能的Python基类后,即在得到一套Python UDF/UDAF/UDTF基类后,可以接收用户基于Python UDF/UDAF/UDTF基类编写的实现UDF/UDAF/UDTF功能的Python程序。

S33:采用Java程序编写Python解析器。

需要说明的是,由于在Spark框架下只能运行Java程序,因此需要将Python程序解析为Java类。

具体地,可以采用Java程序编写Python解析器,而后通过Python解析器将用户基于Python基类编写的实现预设函数功能的Python程序解析为Java类,即,采用Java程序编写与UDF/UDAF/UDTF相关的Python解析器,将用户基于Python UDF/UDAF/UDTF基类编写的实现UDF/UDAF/UDTF功能的Python程序解析转换为Java类,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

S34:通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类。

可选地,通过Python解析器将用户基于Python基类编写的实现预设函数功能的Python程序解析为Java类,即,采用Java程序编写与UDF/UDAF/UDTF相关的Python解析器,将用户基于Python UDF/UDAF/UDTF基类编写的实现UDF/UDAF/UDTF功能的Python程序解析转换为Java类,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

S35:采用Java程序编写Spark框架下实现预设函数功能的Java类。

可选地,采用Java程序编写Spark框架下实现预设函数功能的Java类,即基于采用Java程序编写预设函数的基类(基于Java UDF/UDAF/UDTF基类),编写一套通用的Spark UDF/UDAF/UDTF Java类。

S36:采用Java反射机制调用目标Java类。

其中,Java反射机制是指在运行状态中,对于任意一个类,都能够获知这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。

可选地,采用Spark框架下实现预设函数功能的Java类调用目标Java类,即在Spark UDF/UDAF/UDTF Java类中,采用Java反射机制调用步骤S35中解析后的包含用户逻辑的Java类,以实现用户需求的预设函数的功能,能够在Spark框架下运行实现预设函数功能的Python程序,实现用户需求的函数的功能,且由于Python程序相对于Java程序更加简洁,能够简化Spark框架下程序的设计。

S37:对Python基类、Java类、Python解析器,以及Python程序进行脚本化处理,得到jar包。

可选地,对Python基类、Java类、Python解析器,以及Python程序进行脚本化处理,得到jar包。可以理解的是,jar包作为一种离线工具包,用户仅需上传基于Python基类编写的实现预设函数功能的Python程序的文件,即可一键化输出可在Spark或者Hive框架下运行的jar包,从而无需关心jar包中的各种依赖关系及中间的调用过程,有效提升用户的编程体验。

S38:在Spark框架下运行jar包,以实现将Python程序移植至Spark框架下。

可选地,可以将jar包上传至Spark,在Spark框架下运行jar包,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

本实施例中,通过采用Python程序编写预设函数的基类,得到实现预设函数功能的Python基类,接收用户基于Python基类编写的实现预设函数功能的Python程序,采用Java程序编写Python解析器,通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。通过采用Java程序编写Spark框架下实现预设函数功能的Java类,采用Spark框架下实现预设函数功能的Java类调用目标Java类,以实现将Python程序移植至Spark框架下,能够实现用户需求的函数的功能。通过对Python基类、Java类、Python解析器,以及Python程序进行脚本化处理,得到jar包,能够使用户无需关心jar包中的各种依赖关系及中间的调用过程,有效提升用户的编程体验。通过在Spark框架下运行jar包,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

图4是本发明一实施例提出的跨平台移植Python程序的装置的结构示意图。该跨平台移植Python程序的装置40可以通过软件、硬件或者两者的结合实现。

参见图4,该跨平台移植Python程序的装置40可以包括:接收模块401、解析模块402,以及调用模块403。其中,

接收模块401,用于接收用户编写的实现预设函数功能的Python程序。

可选地,预设函数为Spark框架下的用户自定义函数UDF、用户自定义表生成函数UDTF,以及用户自定义聚合函数UDAF。

可选地,接收模块401具体用于:接收用户基于Python基类编写的实现预设函数功能的Python程序。

解析模块402,用于通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类。

调用模块403,用于采用Spark框架下实现预设函数功能的Java类调用目标Java类,以实现将Python程序移植至Spark框架下。

可选地,调用模块403具体用于:采用Java反射机制调用目标Java类。

一些实施例中,参见图5,调用模块403包括:

编写子模块4031,用于采用Java程序编写Spark框架下实现预设函数功能的Java类。

调用子模块4032,用于采用Java反射机制调用目标Java类。

第一编写模块404,用于采用Java程序编写Python解析器。

第二编写模块405,用于采用Python程序编写预设函数的基类,得到实现预设函数功能的Python基类。

处理模块406,用于对Python基类、Java类、Python解析器,以及Python程序进行脚本化处理,得到jar包。

运行模块407,用于在Spark框架下运行jar包,以实现将Python程序移植至Spark框架下。

需要说明的是,前述图1-图3实施例中对跨平台移植Python程序的方法实施例的解释说明也适用于该实施例的跨平台移植Python程序的装置40,其实现原理类似,此处不再赘述。

本实施例中,通过接收用户编写的实现预设函数功能的Python程序,通过Python解析器将Python程序解析为Java类,并将Java类作为目标Java类,最后采用Spark框架下实现预设函数功能的Java类调用目标Java类,以实现将Python程序移植至Spark框架下,能够在Spark框架下运行实现预设函数功能的Python程序,简化Spark框架下程序的设计。

需要说明的是,在本发明的描述中,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。此外,在本发明的描述中,除非另有说明,“多个”的含义是两个或两个以上。

流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。

应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。

本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。

此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。

上述提到的存储介质可以是只读存储器,磁盘或光盘等。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。

尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1