HuggingFists作为一个低代码平台,很多朋友会关心如何扩展平台算子能力。扩展平台尚不支持的算子功能。本文就介绍一种通过脚本算子扩展算子能力的解决方案。
HuggingFists支持Python和Javascript两种脚语言的算子。两种语言的使用方式相同,使用者可以任选一种自己熟悉的语言来扩展算子功能。通过脚本算子扩展的功能,尽量使用标准脚本语言的标准语法包。如果需要引用第三方的包方法,则需要完成三方包的安装、部署并将安装好的环境映射到HuggingFists的Docker镜像中。对于不太熟悉Docker的用户不建议采用这种复杂的机制扩展算子功能。可以考虑HuggingFists下一版将会发布的数据服务的第三方Web API接口集成功能来扩展复杂功能。下面,我们以PythonScript算子为例,介绍下如何扩展算子的功能。
PythonScript算子位于算子树的”处理”/”脚本”分组下。将其拖着到面板中,可以看到算子有两个属性TAB页,“一般”和“脚本”。
在“一般”属性页内,点击“设置”按钮,为Python脚本算子定义输出端口以及输出端口的输出结构。这里的输出结构必须定义,且必须手工保证其结构与Python脚本中通过DataListener接口输出的数据结构一致。否则,后续算子会出现不可预知的错误。
在“脚本”属性页内,点击“编辑”按钮,按照脚本规范,编写Python脚本。Python内嵌的脚本必须遵循至少包括以下两个函数中的一个,processRows(rowSet, dataListener)或processRow(row, dataListener)。若两个函数同时存在,则优先使用processRows。
processRows表示对传入的集合进行处理。无需特别关注的是,Python脚本算子已经完成了将输入的数据转换为Python语言可接收的数据结构。rowSet是一个字典类型的链表,其中的每个字典对象代表一条记录。dataListener是一个回调接口对象,处理程序可以通过调用该接口将处理结果返回给算子。代码示例如下:
def processRows(rowSet, dataListener):
for row in rowSet:
content = row['dataBlock']
System.out.println(content)
person = {"name": "a", "gender": "女", "party": "共和党"}
dataListener.onData("dataOut", person)
return;
processRow表示对传入的记录进行处理,row是一个字典,代表一条记录。dataListener是一个回调接口对象,处理程序可以通过调用该接口将处理结果返回给算子。代码示例如下:
def processRow(row, dataListener):
content = row['dataBlock']
System.out.println(content)
person = {"name": "a", "gender": "女", "party": "共和党"}
dataListener.onData("dataOut", person)
org = {"name": "总部", "address": "北京市海淀区", "phone": "010-23344444",
"fax": "010-23242334"}
dataListener.onData("orgOut", org)
return
dataListener对象内置onData(portName, row)函数,脚本通过调用该接口将数据写出到指定的端口。portName表示数据要写出的端口的名字,该端口必须是一个我们之前定义好的输出端口;row表示一条处理后的数据,字典对象,其结构应符合对应输出端口的结构定义。
针对示例代码,我们的算子输出端口定义如下:
PythonScript算子目前仅支持python3。有需要的朋友后面可以试着用PythonScript算子扩展平台暂不支持的算子能力了。