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反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Maven pom.xml文件中build,plugin标签的使用小结

《Mavenpom.xml文件中build,plugin标签的使用小结》本文主要介绍了Mavenpom.xml文件中build,plugin标签的使用小结,文中通过示例代码介绍的非常详细,对大家的学... 目录<build> 标签Plugins插件<build> 标签<build> 标签是 pom.XML

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

IDEA与JDK、Maven安装配置完整步骤解析

《IDEA与JDK、Maven安装配置完整步骤解析》:本文主要介绍如何安装和配置IDE(IntelliJIDEA),包括IDE的安装步骤、JDK的下载与配置、Maven的安装与配置,以及如何在I... 目录1. IDE安装步骤2.配置操作步骤3. JDK配置下载JDK配置JDK环境变量4. Maven配置下

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为