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><!--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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美创科技位居IDC MarketScape:中国数据安全管理平台市场「领导者」类别

近日&#xff0c;IDC发布《IDC MarketScape: 中国数据安全管理平台2023年厂商评估》 报告&#xff0c;报告从交付、产品特性、创新能力、研发速度、客户满意度等多个维度对国内厂商进行全面评估。美创科技列为『领导者』类别&#xff01; ◼︎ 报告中&#xff0c;从关键战略指…

MFC网络编程-Udp客户端

目录 1、UI的设计&#xff1a; 2、代码的实现&#xff1a; &#xff08;1&#xff09;、重写CSocket虚函数OnReceive&#xff0c;并且传入对话框的指针 &#xff08;2&#xff09;、初始化SOCKET &#xff08;3&#xff09;、绑定本地IP和端口 &#xff08;4&#xff09;、…

Vue xlsx插件前端导出

一、安装 xlsx npm install --save xlsx file-saver二、具体使用整体代码 如果数据格式是这样就用下面的&#xff0c;直接把数据传到 XLSX.utils.json_to_sheet list: [ { name: John, age: 25 }, { name: Jane, age: 30 }, // ... ]<template><button click"ex…

RCU初学参考资料

参考资料&#xff1a; 1.预备知识&#xff1a;QSBR算法 b-tree-QSBR简介 QSBR是通过quiescent state来检测grace period。如果线程T在某时刻不再持有共享对象的引用&#xff0c;那么该线程T在此时就处于quiescent state。如果一个时间区间内&#xff0c;所有线程都曾处于quie…

kubectl详解

陈述式资源管理方法&#xff1a; 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为 apiserver 能识别的信…

LabVIEW开发双目立体系统猪重估算

LabVIEW开发双目立体系统猪重估算 动物的活重是各种研究中的重要参考&#xff0c;例如动物生长&#xff0c;饲料转化率&#xff0c;健康状况和疾病发生。生长中的动物的体重为保持它们处于适当的营养和环境水平提供了一个有价值的参数或指标。动物的利润通常与收入和成本之间的…

LCD驱动程序——Framebuffer应用编程

1.LCD 操作原理 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意思&#xff0c;buffer 是缓冲的意思&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着一帧图像。Framebuffer 中保存着一帧图像的每一个像素颜色值&#xff0c;假设 L…

程序环境和预处理

目录 1. 程序的翻译环境和执行环境 2. C语言程序的编译链接 2.1. 预处理 2.2. 编译 2.3. 汇编 2.4. 链接 3. 运行环境的简单介绍 4. 预定义符号介绍 5. 预处理指令 #define 5.1. #define定义标识符 5.2. #define定义宏 5.3. #define替换规则 6. 宏和函数的对比 1. …

由k8s升级慢引起的etcd性能不足的问题排查

一、基本介绍 最近etcd查看出现性能 curl --cacert /path/to/etcdctl-ca.crt --cert /path/to/etcdctl.crt --key /path/to/etcdctl.key https://:2379/metrics | grep etcd_disk_wal_fsync_duration_seconds_bucket 当集群规模突破过大时规模时,曾出现如下性能瓶颈问题: etc…

Vue 的异步组件

目录 1&#xff0c;异步组件介绍2&#xff0c;路由中使用3&#xff0c;组件中使用3.1&#xff0c;Vue2 语法3.2&#xff0c;Vue3 语法 1&#xff0c;异步组件介绍 在项目中&#xff0c;有的组件仅在需要时才会加载&#xff0c;这时就需要用到异步组件。 异步组件本质上是一个…

带你从0开始学习自动化框架Airtest

现在市面上做UI自动化的框架很多&#xff0c;包括我们常用的Web自动化框架Selenium&#xff0c;移动端自动化框架Appium。 虽然Selenium和Appium分属同源&#xff0c;而且API都有很多相同的地方&#xff0c;可以无损耗切换&#xff0c;但是还是需要引入不同的库&#xff0c;而…

Debug技巧-不启用前端访问后端

在日常开发中&#xff0c;我们经常会遇到各种问题需要调试&#xff0c;前后端都启动需要耗费一定的时间和内存&#xff0c;方便起见&#xff0c;可以直接用抓包数据访问后端&#xff0c;这里我们需要用到Postman或者ApiFox 抓包数据 在系统前台触发后端请求&#xff0c;在控制…

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路(更新中)

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路&#xff08;更新中&#xff09; 在LSTM预测过程中&#xff0c;极易出现时间滞后&#xff0c;类似于下图&#xff0c;与一个以上的样本点结果错位&#xff0c;产生滞后的效果。 在建模过程中&#xf…

ChatGPT更新多模态,支持图片和语音输入,会带来哪些新体验和影响?

不仅是光使用chat GPT更方便、更厉害&#xff0c;哪些和chat GPT结合技术的技术和产品能力也变得更强 像我们公司目前在用的RPA&#xff0c;就努力和这个chat GPT的技术结合&#xff0c;但是由于能力有限&#xff0c;使用的场景少之又少 但这次Chat GPT的更新&#xff0c;预计…

负载均衡深度解析:算法、策略与Nginx实践

引言 如今&#xff0c;网站和应用服务面临着巨大的访问流量&#xff0c;如何高效、稳定地处理这些流量成为了一个亟待解决的问题。负载均衡技术因此应运而生&#xff0c;它通过将流量合理分配到多个服务器上&#xff0c;不仅优化了资源的利用率&#xff0c;还大大提升了系统的…

服务器数据恢复—EMC存储pool上数据卷被误删的数据恢复案例

服务器数据恢复环境&#xff1a; EMC Unity某型号存储&#xff0c;连接了2台硬盘柜。2台硬盘柜上创建2组互相独立的POOL&#xff0c;2组POOL共有21块520字节硬盘。21块硬盘组建了2组RAID6&#xff0c;1号RAID6有11块硬盘. 2号RAID6有10块硬盘。 服务器故障&检测&#xff1…

[ACTF2023]复现

MDH 源题&#xff1a; from hashlib import sha256 from secret import flagr 128 c 96 p 308955606868885551120230861462612873078105583047156930179459717798715109629 Fp GF(p)def gen():a1 random_matrix(Fp, r, c)a2 random_matrix(Fp, r, c)A a1 * a2.Treturn…

Vue入门——核心知识点

简介 Vue是一套用于构建用户界面的渐进式JS框架。 构建用户界面&#xff1a;就是将后端返回来的数据以不同的形式(例如&#xff1a;列表、按钮等)显示在界面上。渐进式&#xff1a;就是可以按需加载各种库。简单的应用只需要一个核心库即可&#xff0c;复杂的应用可以按照需求…

AR的光学原理?

AR智能眼镜的光学成像系统 AR眼镜的光学成像系统由微型显示屏和光学镜片组成&#xff0c;可以将其理解为智能手机的屏幕。 增强现实&#xff0c;从本质上说&#xff0c;是将设备生成的影像与现实世界进行叠加融合。这种技术基本就是通过光学镜片组件对微型显示屏幕发出的光线…

[Machine Learning][Part 7]神经网络的基本组成结构

这里我们将探索神经元/单元和层的内部工作原理。特别是,与之前学习的回归/线性模型和逻辑模型进行比较。最后接介绍tensorflow以及如何利用tensorflow来实现这些模型。 神经网络和大脑的神经元工作原理类似&#xff0c;但是比大脑的工作原理要简单的多。大脑中神经元的工作原理…