ClickHouse Java多参UDF
一、环境版本
| 环境 | 版本 |
|---|---|
| docker clickhouse | 22.3.10.22 |
docker pull clickhouse/clickhouse-server:22.3.10.22
二、XML配置
2.1 配置文件
# 创建udf配置文件
vim /etc/clickhouse-server/demo_function.xml
<functions><function><type>executable</type><!--udf函数名称--><name>demo_clickhouse_udf</name><!--返回值类型--><return_type>String</return_type><!--返回值名称,默认值为result--><!--当format为JSONEachRow时,取返回json中的result字段--><return_name>result</return_name><!--输入参数--><!--当format为JSONEachRow时,入参为{"argument_1": 入参1,"argument_2": 入参2}--><argument><type>UInt64</type><name>argument_1</name></argument><argument><type>UInt64</type><name>argument_2</name></argument><!--input和output的数据格式化方式--><format>JSONEachRow</format><!--command运行方式,0为指定命令,1为默认方式--><execute_direct>0</execute_direct><!--command命令,最好带上根目录,避免出现函数不支持问题--><command>/usr/bin/java -jar /var/lib/clickhouse/user_scripts/demo_clickhouse_udf-1.0-SNAPSHOT-jar-with-dependencies.jar</command></function>
</functions>
三、Java代码
新建Maven项目
3.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>demo_clickhouse_udf</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><archive><manifest><mainClass>org.example.Main</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>assemble-all</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
</project>
3.2 Main.java
package org.example;import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.annotations.Expose;
import java.io.BufferedInputStream;
import java.io.DataInputStream;public class Main {public static void main(String[] args) {try {DataInputStream in = new DataInputStream(new BufferedInputStream(System.in));String s;// 逐行读取数据while ((s = in.readLine()).length() != 0) {// 获取输入参数Gson gson = new Gson();JsonElement jsonElement = gson.fromJson(s, JsonElement.class);JsonObject jsonObject = jsonElement.getAsJsonObject();String argument_1 = jsonObject.get("argument_1").getAsString();String argument_2 = jsonObject.get("argument_2").getAsString();// 封装输出结果String resultStr = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(new Demo(argument_1, argument_2));System.out.println(gson.toJson(new Result(resultStr)));}System.out.flush();} catch (Exception e) {e.printStackTrace();}}/*** 返回对象*/public static class Demo{@Exposeprivate String param1;@Exposeprivate String param2;public Demo(String param1, String param2){this.param1 = param1;this.param2 = param2;}public String getParam1() {return param1;}public void setParam1(String param1) {this.param1 = param1;}public String getParam2() {return param2;}public void setParam2(String param2) {this.param2 = param2;}}/*** 返回结果* 返回值名称必须跟xml文件中的return_name一致* xml文件return_name默认值result* 即: 返回结果为 "{'result': {...}, 'other': {...}, ...}"时* 返回值ClickHouse调用函数返回值只去result的值*/public static class Result {private String result;public String getResult() {return result;}public void setResult(String result) {this.result = result;}public Result(String result){this.result = result;}}
}
3.3 打包将jar包复制到ClickHouse中
docker cp 路径/demo_clickhouse_udf-1.0-SNAPSHOT-jar-with-dependencies.jar 容器id:/var/lib/clickhouse/user_scripts/demo_clickhouse_udf-1.0-SNAPSHOT-jar-with-dependencies.jar
3.4 SQL验证
SYSTEM RELOAD FUNCTIONS; # 刷新函数
SELECT * FROM system.functions WHERE name = 'demo_clickhouse_udf'; # 查询刚添加的udf函数
select demo_clickhouse_udf(1,2)
返回
{"param1":"1","param2":"2"}
3.5 Json字典,数据展开
返回
{"param1":"1","param2":"2"}
数据展开
selectJSON_VALUE(result, '$.param1') as param1,JSON_VALUE(result, '$.param2') as param2
from(select demo_clickhouse_udf(1,2) as result
) t1;
3.6 Json数组,数据展开
java例程
public static void main(String[] args) {try {DataInputStream in = new DataInputStream(new BufferedInputStream(System.in));String s;// 逐行读取数据while ((s = in.readLine()).length() != 0) {// 获取输入参数Gson gson = new Gson();JsonElement jsonElement = gson.fromJson(s, JsonElement.class);JsonObject jsonObject = jsonElement.getAsJsonObject();String argument_1 = jsonObject.get("argument_1").getAsString();String argument_2 = jsonObject.get("argument_2").getAsString();List<Demo> demoList = new ArrayList<>();demoList.add(new Demo(argument_1, argument_2));demoList.add(new Demo("3", "4"));demoList.add(new Demo("5", "6"));// 封装输出结果String resultStr = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(demoList);System.out.println(gson.toJson(new Result(resultStr)));}System.out.flush();} catch (Exception e) {e.printStackTrace();}}
返回
[{"param1":"1","param2":"2"},{"param1":"3","param2":"4"},{"param1":"5","param2":"6"}]
数据展开
selectJSONExtractString(arrayElement, 'param1') as param1,JSONExtractString(arrayElement, 'param2') as param2
from(select demo_clickhouse_udf(1,2) as result
) t1
ARRAY JOIN JSONExtractArrayRaw(result) AS arrayElement;
四、异常问题
4.1 UNKNOWN_FUNCTION
xml文件名称需以function.xml结尾,其它则会添加失败,找不到函数。
# 运行sql
SYSTEM RELOAD FUNCTIONS; # 刷新函数
SELECT * FROM system.functions WHERE name = 'demo_clickhouse_udf'; # 查询刚添加的udf函数
# 报错
Code: 46. DB::Exception: Unknown function demo_clickhouse_udf: While processing demo_clickhouse_udf(1, 2). (UNKNOWN_FUNCTION) (version 22.3.10.22 (official build))
4.2 UNSUPPORTED_METHOD
1.execute_direct需为0
<execute_direct>0</execute_direct>
2.command需带上根目录,如/usr/bin/java
<command>/usr/bin/java -jar /var/lib/clickhouse/user_scripts/demo_clickhouse_udf-1.0-SNAPSHOT-jar-with-dependencies.jar</command>
3.没有安装java等语言环境
4.没有命令或脚本权限
5.版本不支持,如:22.2.3.5
# 报错
Code: 1. DB::Exception: Executable file /usr/bin/java does not exist inside user scripts folder /var/lib/clickhouse/user_scripts/: While processing demo_clickhouse_udf(1, 2). (UNSUPPORTED_METHOD) (version 22.3.10.22 (official build))
4.3 CANNOT_PARSE_QUOTED_STRING
返回字符串格式不对,没有用result封装成json
// 错误的java示例
System.out.println("{'result':1}");
# 报错
Code: 26. DB::ParsingException: Cannot parse JSON string: expected opening quote: While executing ParallelParsingBlockInputFormat: While executing ShellCommandSource: While processing demo_clickhouse_udf(1, 2): (at row 1) . (CANNOT_PARSE_QUOTED_STRING) (version 22.3.10.22 (official build))
五、参考借鉴
ClickHouse Doc
Github Issues
相关文章:
ClickHouse Java多参UDF
一、环境版本 环境版本docker clickhouse22.3.10.22 docker pull clickhouse/clickhouse-server:22.3.10.22二、XML配置 2.1 配置文件 # 创建udf配置文件 vim /etc/clickhouse-server/demo_function.xml<functions><function><type>executable</type&…...
修改Typora默认微软雅黑字体
修改Typora字体 写在前面 我最近在折腾windows电脑,从macos转像windows不容易啊,因为键盘快捷键经常弄错,这篇文章就是修改Typora中字体显示的问题。 正文内容 我发现在windows中,字体非常的难看,微软雅黑也太丑了…...
ESP32网络开发实例-Web服务器显示LM35传感器数据
Web服务器显示LM35传感器数据 文章目录 Web服务器显示LM35传感器数据1、LM35介绍2、软件准备3、硬件准备4、代码实现4.1 LM35与ADS1115驱动4.2 Web服务器显示LM35传感器数据本文将介绍有关如何在ESP32的Web服务器中显示LM35 温度传感器数据。 1、LM35介绍 LM35 用于测量物体或…...
ATFX汇市:美联储11月利率决议再暂停加息,紧缩货币政策或已接近尾声
ATFX汇市:11月美联储利率决议结果在今日2:00公布,其中提到:美联储寻求以2%的速度实现最大的就业和通胀率,为了达成这些目标,美联储决定将联邦基金利率的目标区间维持在5.25%~5.5%;委员会将会考虑货币政策的…...
g.Grafana之Gauge的图形说明
直接上操作截图 1. 创建一个新的Dashboard 2.为Dashboard创建变量 【General】下的Name与Label的名称自定义 【Query options】 下的Group可以填写Zabbix内的所有组/.*/ , 然后通过Regex正则过滤需要的组名 3.设置Dashboard的图形 我使用文字来描述下这个图 1.我们在dash…...
MySQL笔记--Ubuntu安装MySQL并基于C++测试API
目录 1--安装MySQL 2--MySQL连接 3--代码案例 1--安装MySQL # 安装MySQL-Server sudo apt install mysql-server# 设置系统启动时自动开启 sudo systemctl start mysql # sudo systemctl enable mysql# 检查MySQL运行状态 sudo systemctl status mysql# 进入MySQL终端 sudo…...
与AI对话的艺术:如何优化Prompt以获得更好的响应反馈
前言 在当今数字化时代,人工智能系统已经成为我们生活的一部分。我们可以在智能助手、聊天机器人、搜索引擎等各种场合与AI进行对话。然而,要获得有益的回应,我们需要学会与AI进行有效的沟通,这就涉及到如何编写好的Prompt。 与…...
outlook是什么软件outlook邮箱撤回邮件方法
Outlook是微软公司开发的一款邮件客户端,也是Office办公套件的一部分。它可以与多个电子邮件服务提供商(如Outlook.com、Exchange、Gmail等)集成,用户可以使用Outlook来发送、接收和管理电子邮件、日历、联系人、任务等信息。本篇…...
电脑如何录制小视频
如果你想在你的电脑上录制视频分享给你的朋友或者亲人,无论你的电脑是win还是mac,都可以在本篇文章中找到电脑录制视频的详细教程。小编为你们整理了2种不同系统电脑的录制详细流程,继续阅读查看吧! 第一部分:windows…...
vue使用百度富文本
🔥博客主页: 破浪前进 🔖系列专栏: Vue、React、PHP ❤️感谢大家点赞👍收藏⭐评论✍️ 1、下载UEditor 链接已放到文章中了 2、上传到项目目录中 一般上传到public下,方便到时候打包进去,以免…...
【Springboot】集成Swagger
引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> 浏览器 启动项目后 在浏览器中输入地址 localhost:端口号/swagger-ui/ 使…...
[SpringCloud | Linux] CentOS7 部署 SpringCloud 微服务
目录 一、环境准备 1、工具准备 2、虚拟机环境 3、Docker 环境 二、项目准备 1、配置各个模块(微服务)的 Dockerfile 2、配置 docker-compose.yml 文件 3、Maven 打包 4、文件整合并传输 三、微服务部署 1、部署至 Docker 2、访问微服务 四…...
阿里面试:让代码不腐烂,DDD是怎么做的?
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的高并发落地经验? 谈谈你对DDD的理解…...
NoSQL数据库使用场景以及架构介绍
文章目录 一. 什么是NoSQL?二. NoSQL分类三. NoSQL与关系数据库有什么区别四. NoSQL主要优势和缺点五. NoSQL体系框架 其它相关推荐: 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 架构设计之大数据架构(Lambda架构、Kap…...
RFID系统提升物流信息管理效率应用解决方案
一、物流仓储管理方法 1、在仓库的进出口处安装RFID读写器,当粘贴RFID标签的电动叉车和货物进入装载区时,RFID读写器会自动检索并记录信息,当它们离开物流配送中心时,入口处的RFID读写器会读取标签信息,并生成出货单&…...
ONNX的结构与转换
ONNX的结构与转换 1. 背景2. ONNX结构分析与修改工具2.1. ONNX结构分析2.2. ONNX的兼容性问题2.3. 修改ONNX模型 3. 各大深度学习框架如何转换到ONNX?3.1. MXNet转换ONNX3.2. TensorFlow模型转ONNX3.3. PyTorch模型转ONNX3.4. PaddlePaddle模型转ONNX3.4.1. 简介3.4…...
vue3中,使用html2canvas截图包含视频、图片、文字的区域
需求:将页面中指定区域进行截图,区域中包含了图片、文字、视频。 第一步,先安装 npm install html2canvas第二步,在页面引入: import html2canvas from html2canvas;第三步,页面使用: 1&…...
后端神器!代码写完直接调试!
Apipost推出IDEA插件非常省时高效,写完代码直接可以进行调试,而且支持生成接口文档,真是后端神器啊! 可以点击下方链接安装更新或在插件商店中搜索安装 下载链接:https://plugins.jetbrains.com/plugin/22676-apipos…...
MATLAB | 万圣节来画个简单的可爱鬼叭!
万圣节要到啦一起来画个可爱鬼吧~ 代码比较的短: 完整代码 figure(Units,normalized,Position,[.2,.1,.52,.72]); axgca;hold on;axis off; ax.DataAspectRatio[1,1,1]; ax.YDirreverse; ax.XLim[0,100]; ax.YLim[0,100]; [X,Y]meshgrid(linspace(0,1,200)); Zsq…...
贪心算法学习------优势洗牌
目录 一,题目 二,题目接口 三,解题思路和代码 全部代码: 一,题目 给定两个数组nums1和nums2,nums1相对于nums2的优势可以用满足nums1[i]>nums2[i]的索引i的数目来描述。 返回nums1的任意排序,使其优…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
