Executable 和 ExecutablePool 表引擎
Executable 和 ExecutablePool 表引擎允许您定义一个表,其行是由您定义的脚本生成的(通过将行写入 stdout)。可执行脚本存储在 users_scripts 目录中,并可以从任何来源读取数据。
Executable表:每次查询时都运行脚本ExecutablePool表:维护一个持久进程池,并从池中获取进程进行读取
您可以选择性地包含一个或多个输入查询,将其结果流式传输到 stdin 供脚本读取。
创建 Executable 表
Executable 表引擎需要两个参数:脚本的名称和传入数据的格式。您可以选择性地传入一个或多个输入查询:
以下是 Executable 表的相关设置:
send_chunk_header- 描述:在发送分块进行处理之前,发送每个分块中的行数。此设置有助于以更高效的方式编写脚本以预分配一些资源
- 默认值:false
command_termination_timeout- 描述:命令终止超时时间(以秒为单位)
- 默认值:10
command_read_timeout- 描述:从命令 stdout 读取数据的超时时间(以毫秒为单位)
- 默认值:10000
command_write_timeout- 描述:向命令 stdin 写入数据的超时时间(以毫秒为单位)
- 默认值:10000
让我们来看一个例子。以下 Python 脚本名为 my_script.py,并保存在 user_scripts 文件夹中。它读取一个数字 i 并打印 i 个随机字符串,每个字符串前面都有一个用制表符分隔的数字:
以下的 my_executable_table 是根据 my_script.py 的输出构建的,每次从 my_executable_table 执行 SELECT 时,它将生成 10 个随机字符串:
创建表的操作会立即返回,而不会调用脚本。查询 my_executable_table 会导致脚本被调用:
将查询结果传递给脚本
Hacker News 网站的用户会发表评论。Python 包含一个自然语言处理工具包(nltk),里面有一个 SentimentIntensityAnalyzer 用于判断评论是积极的、消极的还是中性的 - 包括赋值在 -1(非常消极的评论)和 1(非常积极的评论)之间。让我们创建一个 Executable 表,使用 nltk 计算 Hacker News 评论的情感。
该示例使用 这里描述的 hackernews 表。hackernews 表包括一个类型为 UInt64 的 id 列和一个名为 comment 的 String 列。让我们从定义 Executable 表开始:
关于 sentiment 表的一些说明:
- 文件
sentiment.py保存在user_scripts文件夹中(user_scripts_path设置的默认文件夹) TabSeparated格式意味着我们的 Python 脚本需要生成包含制表符分隔值的原始数据行- 查询选择了
hackernews中的两个列。Python 脚本需要从传入的行中解析出这些列的值
这是 sentiment.py 的定义:
关于我们的 Python 脚本的一些说明:
- 为了使其工作,您需要运行
nltk.downloader.download('vader_lexicon')。这可以放在脚本中,但这样每次在sentiment表上执行查询时都会下载 - 这不是高效的 - 每个
row的值将是SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20查询结果集中的一行 - 传入的行是制表符分隔的,因此我们使用 Python 的
split函数解析出id和comment polarity_scores的结果是一个包含多个值的 JSON 对象。我们决定只抓取该 JSON 对象的compound值- 请记住,ClickHouse 中的
sentiment表使用TabSeparated格式并包含两个列,因此我们的print函数用制表符分隔这些列
每次您编写查询以从 sentiment 表中选择行时,查询 SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20 会被执行,并将结果传递给 sentiment.py。让我们测试一下:
响应如下所示:
创建 ExecutablePool 表
ExecutablePool 的语法与 Executable 类似,但有一些特定于 ExecutablePool 表的相关设置:
pool_size- 描述:进程池大小。如果大小为 0,则没有大小限制
- 默认值:16
max_command_execution_time- 描述:最大命令执行时间(以秒为单位)
- 默认值:10
我们可以轻松地将上述 sentiment 表转换为使用 ExecutablePool 而不是 Executable:
当您的客户端查询 sentiment_pooled 表时,ClickHouse 将按需维护 4 个进程。