用于 UDF 的 executable 表函数
executable 表函数会基于用户自定义函数(UDF)的输出创建一张表,该函数定义在一个向 stdout 输出行的脚本中。可执行脚本存储在 users_scripts 目录中,并且可以从任意数据源读取数据。请确保你的 ClickHouse 服务器具备运行该可执行脚本所需的全部软件包。例如,如果这是一个 Python 脚本,则要确保服务器已经安装了所需的 Python 包。
你可以选择性地提供一个或多个输入查询,将其结果以流式方式写入 stdin,供脚本读取。
注意
普通 UDF 函数与 executable 表函数和 Executable 表引擎之间的一个关键区别在于,普通 UDF 函数不能改变行数。例如,如果输入是 100 行,则结果也必须返回 100 行。使用 executable 表函数或 Executable 表引擎时,你的脚本可以执行任意所需的数据转换,包括复杂聚合。
语法
executable 表函数需要三个参数,并且可以接收一个可选的输入查询列表:
script_name: 脚本的文件名。保存在user_scripts文件夹中(即user_scripts_path设置的默认文件夹)format: 生成表的格式structure: 生成表的表结构(schema)input_query: 可选查询(或查询集合),其结果通过 stdin 传递给脚本
注意
如果你要使用相同的输入查询重复调用同一个脚本,建议使用 Executable 表引擎。
下面的 Python 脚本名为 generate_random.py,保存在 user_scripts 文件夹中。它读取一个数字 i 作为输入,并输出 i 个随机字符串,每个字符串前面带有一个数字,二者之间用制表符分隔:
我们来调用该脚本,让它生成 10 个随机字符串:
响应结果如下:
设置
send_chunk_header- 控制在发送要处理的数据块之前,是否先发送行数。默认值为false。pool_size— 连接池大小。如果pool_size指定为 0,则不限制连接池大小。默认值为16。max_command_execution_time— 处理数据块时,可执行脚本命令的最大执行时间。以秒为单位指定。默认值为 10。command_termination_timeout— 可执行脚本应包含主读写循环。在表函数被销毁后,管道会被关闭,可执行文件有command_termination_timeout秒的时间完成关闭,然后 ClickHouse 会向子进程发送 SIGTERM 信号。以秒为单位指定。默认值为 10。command_read_timeout- 从命令的 stdout 读取数据的超时时间,单位为毫秒。默认值为 10000。command_write_timeout- 向命令的 stdin 写入数据的超时时间,单位为毫秒。默认值为 10000。
将查询结果传递给脚本
请务必查看 Executable 表引擎中关于如何将查询结果传递给脚本的示例。下面展示如何使用 executable 表函数来执行该示例中相同的脚本: