在用户使用NL2SQL得到SQL语句后,通常希望得到这个SQL查询出的结果,同时能够展示一些更直观的结果,比如柱状图、饼图等。PolarDB的SQL2Chart方案可以执行用户的SQL,最后返回报表。
快速上手
在PolarDB集群中,添加了AI节点后,可以使用SQL2Chart功能,把一条可以在PolarDB中执行的SQL转换为一张图片或者一段HTML片段。
假设在数据库中有张表为employee_salary
,里面的内容为:
id | name | month | salary |
1 | 张三 | 4月 | 2000.00 |
2 | 张三 | 5月 | 1500.00 |
3 | 李四 | 5月 | 1500.00 |
同时,我们创建了pattern
表(该表用于PolarDB NL2SQL也用于PolarDB SQL2Chart):
DROP TABLE IF EXISTS `polar4ai_nl2sql_pattern`;
CREATE TABLE `polar4ai_nl2sql_pattern` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`pattern_question` text COMMENT '模板问题',
`pattern_description` text COMMENT '模板描述',
`pattern_sql` text COMMENT '模板SQL',
`pattern_params` text COMMENT '模板参数',
`chart_setting` text COMMENT '图表配置',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
在pattern
表中插入一条记录:
INSERT INTO `auto_test`.`polar4ai_nl2sql_pattern` (`id`, `pattern_question`, `pattern_description`, `pattern_sql`, `pattern_params`, `chart_setting`) VALUES (5, '#{name}4月份和5月份的工资分别是多少?', '【姓名】4月份和5月份的工资分别是多少?', 'select month,salary from employee_salary where name=#{name}', '[{\'table_name\':\'employee_salary\'}]','{\'chart_type\':\'bar\',\'x_axis\':\'month\',\'y_axis\':\'salary\',\'x_label\':\'月份\',\'y_label\':\'工资\',\'title\':\'月份工资图\'}');
那么,通过一条SQL就可以得到对应SQL的图片链接:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `month`,salary from employee_salary where name='张三') WITH (setting_table_name='polar4ai_nl2sql_pattern', setting_id='3', result_type='IMAGE')
在这条SQL中,setting_id
可以从NL2SQL的返回结果中得到。
示例:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql,
SELECT '张三的工资是多少?') WITH (basic_index_name='schema_index',pattern_index_name='pattern_index',
pattern_index_threshold=0.1,with_pattern_id=1);
执行以上SQL会返回SQL和pattern_id
,返回的pattern_id
可以用于SQL2Chart里的setting_id
。
返回对应SQL的图片链接:
http://db4ai-aiengine-cn-hangzhou-dataset-pre.oss-cn-hangzhou.aliyuncs.com/pc-2ze47ma2c515087l6/OSSAccessKeyId=xxxxxxx&Expires=1716130199&Signature=KvPFzfMebIEmqxPIXURurwwbsXM%3D
打开对应的链接就可以看到下面的图片:
PolarDB SQL2Chart支持两种模式:
在线SQL2Chart:根据指定的SQL和指定的
chart_setting
,在线生成图片或者HTML,来展示指定SQL在数据库上的执行结果。离线SQL2Chart:根据指定的SQL,离线推理图片的类型和参数,生成图片或者HTML,展示指定SQL在数据库上的执行结果。
在线SQL2Chart
语法说明
执行以下SQL,返回结果为HTML文件:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `month`,salary from employee_salary where name='张三') WITH (setting_table_name='polar4ai_nl2sql_pattern', setting_id='5', result_type='HTML')
说明返回的链接不存在权限限制,仅存在时效限制,有效时间为1小时,过时将失效。
执行以下SQL,返回结果为PNG图片:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `month`,salary from employee_salary where name='张三') WITH (setting_table_name='polar4ai_nl2sql_pattern', setting_id='5', result_type='IMAGE')
参数说明
setting_table_name
为对应的chart_setting
所在的pattern
表;setting_id
为chart_setting
对应的id;result_type
为生成的图片的类型,可以为HTML或者IMAGE。
sql_fetching=0
表示直接使用传入的SQL,sql_fetching=1
表示使用传入的SQL获取真正的SQL。
示例1:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `month`,salary from employee_salary where name='张三') WITH (setting_table_name='polar4ai_nl2sql_pattern', setting_id='5', result_type='IMAGE',sql_fetching=0)
该SQL代表直接使用
select `month`,salary from employee_salary where name='张三'
来画图。示例2:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select sql_text from msg_log where id=2) WITH (setting_table_name='polar4ai_nl2sql_pattern', setting_id='5', result_type='IMAGE',sql_fetching=1)
该SQL代表从
select sql_text from msg_log where id=2
把SQL提取出来,然后用提取出来的SQL进行画图。
生成的图片支持饼图、折线图和柱状图。
生成饼图
语法说明
如果生成的是饼图,polar4ai_nl2sql_pattern
中chart_setting
样例参数如下所示:
{'chart_type':'pie','labels':'month','content':'salary','x_label':'月份','y_label':'工资','title':'月份工资图'}
参数说明
labels
为查询结果中的对应为标签的列;content
为查询结果中对应为数据的列;x_label
为标签列的展示名称;y_label
为数据列的展示名称;title
为图片的标题。
针对样例数据和样例参数,执行如下SQL:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `month`,salary from employee_salary where name='张三') WITH (setting_table_name='polar4ai_nl2sql_pattern', setting_id='5', result_type='IMAGE')
执行后可生成下面的图片对应的链接:
生成折线图
语法说明
如果生成的是折线图,polar4ai_nl2sql_pattern
中chart_setting
样例参数如下所示:
{'chart_type':'line','x_axis':'month','y_axis':'salary','x_label':'月份','y_label':'工资','title':'月份工资图'}
参数说明
labels
为查询结果中的对应为标签的列;content
为查询结果中对应为数据的列;x_label
为标签列的展示名称;y_label
为数据列的展示名称;title
为图片的标题。
针对样例数据和样例参数,执行如下SQL:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `month`,salary from employee_salary where name='张三') WITH (setting_table_name='polar4ai_nl2sql_pattern', setting_id='5', result_type='IMAGE')
执行后可生成下面的图片对应的链接:
生成柱状图
语法说明
如果生成的是柱状图,polar4ai_nl2sql_pattern
中chart_setting
样例参数如下所示:
{'chart_type':'bar','x_axis':'month','y_axis':'salary','x_label':'月份','y_label':'工资','title':'月份工资图'}
参数说明
labels
为查询结果中的对应为标签的列;content
为查询结果中对应为数据的列;x_label
为标签列的展示名称;y_label
为数据列的展示名称;title
为图片的标题。
针对样例数据和样例参数,执行如下SQL:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `month`,salary from employee_salary where name='张三') WITH (setting_table_name='polar4ai_nl2sql_pattern', setting_id='5', result_type='IMAGE')
执行后可生成下面的图片对应的链接:
离线SQL2Chart
语法说明
执行以下SQL,返回结果为PNG文件:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `name` as `姓名`,salary as `薪水` from employee_salary where `month`='5月') WITH (mode='async', result_type='IMAGE')
执行以下SQL,返回结果为HTML文件:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_data2chart, select `name` as `姓名`,salary as `薪水` from employee_salary where `month`='5月') WITH (mode='async', result_type='HTML')
说明返回的链接不存在权限限制,仅存在时效限制,有效时间为1小时,过时将失效。
执行以上SQL会根据 select `name` as `姓名`,salary as `薪水` from employee_salary where `month`='5月'
选取需要转图表的数据,并开始数据转图表的离线任务。
选取的数据量不能超过50列和10000行。
SQL执行完毕后会得到task_id
,如bce632ea-97e9-11ee-bdd2-492f4dfe0918
,之后执行以下SQL查看任务是否完成:
/*polar4ai*/show task `bce632ea-97e9-11ee-bdd2-492f4dfe0918`
当查询到taskStatus
为finish
时,可以通过filePath
下载生成的图片。
参数说明
在SQL_DATA2CHART
的with
条件中,除了必须带有mode='async'
外,还支持参数:
result_type:表示返回的图表类型,可选值范围为['IMAGE', 'HTML']。
不填写时默认为'HTML',即返回的
filePath
链接为网页链接,在网页链接中可以进行图表格式的编辑;显示指定为'IMAGE'时,即
result_type='IMAGE'
时,返回的filePath
链接为图片下载链接。
对于本例子中的结果为PNG图片的SQL,对应任务生成的图片样式如下所示:
扩展使用
SQL2Chart功能和NL2SQL功能联合使用,可以实现NL2Chart效果。