ClickHouse用UDF解析XML字符串和XML文件

2024-04-24 03:12

本文主要是介绍ClickHouse用UDF解析XML字符串和XML文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.如果是读取xml文件的时候,文件入库需要使用文件读取UDF

创建了1个测试文件

wsdFileRead(): 直接读取文件内容

SELECT wsdFileRead('/home/temp/wsd_test.xml')Query id: 09b6e5fe-7169-43f7-b001-90e2eeabb8da┌─wsdFileRead('/home/temp/wsd_test.xml')─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ <?xml version="1.0" encoding="UTF-8"?><des>  <context>    <ANNOUNCEMENT_START_TIME>20240416</ANNOUNCEMENT_START_TIME>    <LAND_DISTRICT>1101202</LAND_DISTRICT>    <FIELD_NUM>12</FIELD_NUM>    <TRA_AGENCY_CODE>11110000MB03920782F</TRA_AGENCY_CODE>    <PUB_SERVICE_PLAT_CODE>121100002400591890H</PUB_SERVICE_PLAT_CODE>    <UNIT_ADDRESS>TEST1</UNIT_ADDRESS>    <LAND_PROJECT_NAME>TEST2</LAND_PROJECT_NAME>  </context></des> │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘1 row in set. Elapsed: 0.002 sec.

wsdFileReadB64(): 读取文件内容并base64加密

SELECT wsdFileReadB64('/home/temp/wsd_test.xml')Query id: 76ea5d06-7802-4f71-98e5-0728d9b0372e┌─wsdFileReadB64('/home/temp/wsd_test.xml')──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48ZGVzPiAgPGNvbnRleHQ+ICAgIDxBTk5PVU5DRU1FTlRfU1RBUlRfVElNRT4yMDI0MDQxNjwvQU5OT1VOQ0VNRU5UX1NUQVJUX1RJTUU+ICAgIDxMQU5EX0RJU1RSSUNUPjExMDEyMDI8L0xBTkRfRElTVFJJQ1Q+ICAgIDxGSUVMRF9OVU0+MTI8L0ZJRUxEX05VTT4gICAgPFRSQV9BR0VOQ1lfQ09ERT4xMTExMDAwME1CMDM5MjA3ODJGPC9UUkFfQUdFTkNZX0NPREU+ICAgIDxQVUJfU0VSVklDRV9QTEFUX0NPREU+MTIxMTAwMDAyNDAwNTkxODkwSDwvUFVCX1NFUlZJQ0VfUExBVF9DT0RFPiAgICA8VU5JVF9BRERSRVNTPlRFU1QxPC9VTklUX0FERFJFU1M+ICAgIDxMQU5EX1BST0pFQ1RfTkFNRT5URVNUMjwvTEFORF9QUk9KRUNUX05BTUU+ICA8L2NvbnRleHQ+PC9kZXM+ │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘1 row in set. Elapsed: 0.002 sec.

二.如果处理clickhouse的字段含有xml字符串的情况

1.导入自定义UDF 

函数名

  • wsdXpathArrB64('参数1',参数2)
  • wsdXpathB64('参数1‘,'参数2')

2.wsdXpathB64

此函数参数1传递字段值,需要base64编码,保证了xml字段数据如果含有特殊符号也可以解析成功,

参数2传递xpath表达式

这里我随便选取一个时间节点它的表达式是/des/context/ANNOUNCEMENT_START_TIME

具体使用 

SELECT decodeURLComponent(base64Decode(submit_content)) AS ROUTE_WAY
FROM
(SELECT wsdXpathB64(base64Encode(submit_content), '/des/context/ANNOUNCEMENT_START_TIME') AS submit_contentFROM WSD_CONTENTWHERE sid = '001100005c20f73c4232b626dba00fa921ce'
)
LIMIT 4Query id: f0dc9ace-c05d-4a47-b12f-f7102093fa57┌─ROUTE_WAY─┐
│ 20240416  │
└───────────┘

3.wsdXpathArrB64

第一个参数和上面的函数一样,base64编码后的字段

第二个参数传一个xpath表达式的数组

具体如下

SELECTsid,decodeURLComponent(base64Decode(submit_content[1])) AS ROUTE_WAY,decodeURLComponent(base64Decode(submit_content[2])) AS DATA_NO,decodeURLComponent(base64Decode(submit_content[3])) AS DATA_KEY,decodeURLComponent(base64Decode(submit_content[4])) AS CA_KEY,decodeURLComponent(base64Decode(submit_content[5])) AS DATA_EN,decodeURLComponent(base64Decode(submit_content[6])) AS DATA_TYPE,FROM
(SELECTwsdXpathArrB64(base64Encode(replaceRegexpAll(submit_content, '\\+', ' ')), ['/des/title/ROUTE_WAY', '/des/title/DATA_NO', '/des/title/DATA_KEY', '/des/title/CA_KEY', '/des/title/DATA_EN', '/des/title/DATA_TYPE']) AS submit_content,sidFROM CEN_SUBMIT_CONTEXT_600WHERE sid = '0011726f801b96724c0790f9a38e3593cca7'
)Query id: 147b7dba-f694-4cbc-84cd-85f781244d20Row 1:
──────
sid:                     0011726f801b96724c0790f9a38e3593cca7
ROUTE_WAY:               0
DATA_NO:                 600
DATA_KEY:                ff8080818d548044018e59dc7ac10bde
CA_KEY:                  88888888889999999999
DATA_EN:                 DEAL_BEHAVIOR_INFO
DATA_TYPE:               1

4.解析xml文件

##使用不带base64加密的函数
SELECTwsdXpathB64(base64Encode(wsdFileRead('/home/temp/wsd_test.xml')), '/des/context/ANNOUNCEMENT_START_TIME') AS xx,base64Decode(xx) AS yyQuery id: d9db0f57-e187-4137-ba92-3024b5fe8e61┌─xx───────────┬─yy───────┐
│ MjAyNDA0MTY= │ 20240416 │
└──────────────┴──────────┘1 row in set. Elapsed: 0.004 sec.###使用带base64加密的函数
SELECTwsdXpathB64(wsdFileReadB64('/home/temp/wsd_test.xml'), '/des/context/ANNOUNCEMENT_START_TIME') AS xx,base64Decode(xx) AS yyQuery id: 55a5da4b-46d6-4205-9844-3cd2c17a3a2b┌─xx───────────┬─yy───────┐
│ MjAyNDA0MTY= │ 20240416 │
└──────────────┴──────────┘1 row in set. Elapsed: 0.005 sec.

这篇关于ClickHouse用UDF解析XML字符串和XML文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930610

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工