背景
前面曾體驗(yàn)過(guò)通過(guò)零代碼、可視化、拖拉拽的方式快速完成了從 MySQL
到 ClickHouse
的數(shù)據(jù)遷移,但是在實(shí)際生產(chǎn)環(huán)境,我們?cè)谶w移到目標(biāo)庫(kù)之前還需要做一些過(guò)濾和轉(zhuǎn)換工作;比如,在詩(shī)詞數(shù)據(jù)遷移后,發(fā)現(xiàn)原來(lái) MySQL
中的詩(shī)詞數(shù)據(jù)都是繁體字,這就導(dǎo)致在直接遷移到 ClickHouse
做統(tǒng)計(jì)分析時(shí)生成的圖表展示也是繁體中文的,對(duì)于不熟悉繁體中文的用戶來(lái)說(shuō)影響體驗(yàn)。
今天就借助 ETLCloud
提供的自定義規(guī)則能力,同時(shí)調(diào)用第三方 jar
包 opencc4j
,完成繁體中文到簡(jiǎn)體中文的轉(zhuǎn)換;具體來(lái)說(shuō),將詩(shī)詞數(shù)據(jù)庫(kù)從 MySQL
遷移到 ClickHouse
,并在入庫(kù)之前完成數(shù)據(jù)清洗轉(zhuǎn)換工作,完成數(shù)據(jù)表中標(biāo)題、作者與內(nèi)容等字段的繁體中文到簡(jiǎn)體中文的轉(zhuǎn)換。
數(shù)據(jù)集說(shuō)明
MySQL
數(shù)據(jù)庫(kù)中的庫(kù)表 poetry
結(jié)構(gòu)如下,數(shù)據(jù)量: 311828
。
CREATE TABLE `poetry` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(150) NOT NULL COLLATE 'utf8mb4_unicode_ci',
`yunlv_rule` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
`author_id` INT(10) UNSIGNED NOT NULL,
`content` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
`dynasty` VARCHAR(10) NOT NULL COMMENT '詩(shī)所屬朝代(S-宋代, T-唐代)' COLLATE 'utf8mb4_unicode_ci',
`author` VARCHAR(150) NOT NULL COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=311829;
ClickHouse
中的建表語(yǔ)句:
CREATE TABLE poetry.poetry (`id` Int32, `title` String, `yunlv_rule` String, `author_id` Int32, `content` String, `dynasty` String, `author` String) ENGINE = MergeTree() PRIMARY KEY id ORDER BY id SETTINGS index_granularity = 8192
工具選型
- ClickHouse數(shù)據(jù)庫(kù)
- Docker部署ETLCloudV2.2
- ETLCloud的庫(kù)表輸入組件、數(shù)據(jù)清洗轉(zhuǎn)換組件、釘釘消息組件
Note:這里選擇的是社區(qū)版,采用 Docker
部署的方式輕量、快速啟動(dòng): docker pull ccr.ccs.tencentyun.com/restcloud/restcloud-etl:V2.2
。
創(chuàng)建應(yīng)用與流程
先創(chuàng)建應(yīng)用(因?yàn)楹竺娴囊?guī)則是跟著應(yīng)用走的),填寫基本的應(yīng)用配置信息。
接著,創(chuàng)建數(shù)據(jù)流程,填寫信息即可。
自定義規(guī)則
在真正開(kāi)始數(shù)據(jù)遷移前,先準(zhǔn)備好清洗轉(zhuǎn)換規(guī)則,到遷移入庫(kù)時(shí)直接配置選擇定義好的規(guī)則即可。
進(jìn)入應(yīng)用配置——>新增規(guī)則分類——>新增自定義規(guī)則
編寫從繁體中文到簡(jiǎn)體中文的規(guī)則代碼,其中,類名是自動(dòng)生成的,先是引入了轉(zhuǎn)換的工具類: ZhConverterUtil
,然后調(diào)用其靜態(tài)方法即可;編寫完畢后,點(diǎn)擊“編譯并保存”,正常的話會(huì)提示編譯成功~。
package cn.restcloud.etl.rule.ext;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import java.sql.Connection;
import cn.restcloud.framework.core.context.*;
import cn.restcloud.etl.base.IETLBaseEvent;
import cn.restcloud.etl.base.IETLBaseProcessEngine;
import cn.restcloud.framework.core.util.*;
import cn.restcloud.framework.core.util.db.rdb.*;
import cn.restcloud.etl.rule.service.ETLProcessRuleUtil;
import java.util.*;
import com.github.houbb.opencc4j.util.ZhConverterUtil;
/**
indoc是一個(gè)map的包裝對(duì)像內(nèi)部結(jié)構(gòu)為key-value
被流程的Java規(guī)則節(jié)點(diǎn)調(diào)用時(shí),返回0表示終止流程,返回1表示成功,其中indoc為流數(shù)據(jù),fieldId為空值
當(dāng)被字段綁定運(yùn)行時(shí)fieldId為綁定的字段Id,流入數(shù)據(jù)的每一行作為indoc對(duì)像傳入本方法執(zhí)行一次
params為綁定規(guī)則時(shí)填寫的傳入的參數(shù)格式為JSON字符串
繁體中文轉(zhuǎn)為簡(jiǎn)體中文
2023-07-07 10:58:21
admin
*/
public class ETL_64a77f4d955fc70345c4041a implements IETLBaseEvent {
@Override
public String execute(IETLBaseProcessEngine engine, Document modelNodeDoc, Document indoc,String fieldId,String params) throws Exception {
//List<Document> dataDocs=engine.getData(indoc); //上一節(jié)點(diǎn)傳入的數(shù)據(jù)流(僅作為Java規(guī)則節(jié)點(diǎn)運(yùn)行可用)
Document paramsDoc=ETLProcessRuleUtil.paramsToDocument(params);//規(guī)則參數(shù)轉(zhuǎn)為一個(gè)map包裝對(duì)像key-value
String paramsValue=DocumentUtil.getString(paramsDoc,"參數(shù)id"); //讀取規(guī)則選中時(shí)輸入的自定義參數(shù)值
String fieldValue=indoc.getString(fieldId); //獲取規(guī)規(guī)綁定的字段Id獲取字段值
PrintUtil.o(fieldId+"取到的值為=>"+fieldValue); //PrintUtil.o();可以打印變量到控制以日志中
//TODO 對(duì)fieldValue進(jìn)行自定義處理
String result = ZhConverterUtil.toSimple(fieldValue);
PrintUtil.o("轉(zhuǎn)換后的值為=>"+result);
indoc.put(fieldId,result); //把新的值覆蓋舊字段的值
return "1";
}
}
Note:這里需要注意的是,我們用到了第三方的 Jar
包 opencc4j
來(lái)完成這一工作,那么 ETLCloud
如何知道要怎樣調(diào)用自定義的工具類的方法呢?這就需要我們將第三方的 jar
放到 ETLCloud
的部署目錄下: /usr/tomcat/webapps/ROOT/WEB-INF/lib
。
[root@etl ~]# docker cp /opt/opencc4j-1.8.1.jar de63b29c71d0:/usr/tomcat/webapps/ROOT/WEB-INF/lib
Successfully copied 513kB to de63b29c71d0:/usr/tomcat/webapps/ROOT/WEB-INF/lib
然后點(diǎn)擊版本更新,平臺(tái)提示以下內(nèi)容:
平臺(tái)配置(Successfully registered (0) java bean, update (2) java bean information!, API升級(jí)結(jié)果: 從Jar文件中更新或注冊(cè)(0)個(gè)服務(wù)、(0)個(gè)輸入?yún)?shù)、(0)個(gè)輸出編碼! ), ETL配置(Successfully registered (0) java bean, update (0) java bean information!, API升級(jí)結(jié)果: 從Jar文件中更新或注冊(cè)(2)個(gè)服務(wù)、(0)個(gè)輸入?yún)?shù)、(0)個(gè)輸出編碼! )
遷移實(shí)踐
接下來(lái)通過(guò)可視化的配置與操作完成從 MySQL
到 ClickHouse
的詩(shī)詞數(shù)據(jù)快速轉(zhuǎn)換與遷移操作。
數(shù)據(jù)源配置
- 配置Source:MySQL
選擇 MySQL
,填寫IP: 端口以及用戶密碼信息。
測(cè)試連接成功~
- 配置Sink:ClickHouse
數(shù)據(jù)源選擇之前文章遷移的 ClickHouse 詩(shī)詞數(shù)據(jù)庫(kù)。
可視化配置流程
創(chuàng)建好流程后,可以通過(guò)點(diǎn)擊“流程設(shè)計(jì)”按鈕,進(jìn)入流程可視化的配置頁(yè)面。
- 庫(kù)表輸入:MySQL
在左側(cè)的輸入組件中,選擇“庫(kù)表輸入”,拖至中央的流程繪制區(qū),雙擊進(jìn)入配置階段。
第一步:選擇我們配置好的 MySQL
數(shù)據(jù)源,可以載入 MySQL
中已有的表。
第二步:可以根據(jù)選擇的表,生成 SQL
語(yǔ)句。
第三步:可從表中讀取到各個(gè)字段的定義,支持添加、刪除字段。
第四步:根據(jù) SQL
語(yǔ)句自動(dòng)進(jìn)行了數(shù)據(jù)預(yù)覽,這樣的一個(gè)檢查操作,保證了后續(xù)操作的正常執(zhí)行。
- 數(shù)據(jù)清洗轉(zhuǎn)換:opencc4j實(shí)現(xiàn)繁體中文轉(zhuǎn)簡(jiǎn)體中文
在對(duì)字段配置規(guī)則前,先熟悉下 opencc4j
在后端開(kāi)發(fā)中的用法。
- 引入依賴
<!-- Opencc4j 支持中文繁簡(jiǎn)體轉(zhuǎn)換 -->
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>opencc4j</artifactId>
<version>1.8.1</version>
</dependency>
- 編碼轉(zhuǎn)換
import com.github.houbb.opencc4j.util.ZhConverterUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootOpencc4jApplicationTests {
// 繁體中文轉(zhuǎn)簡(jiǎn)體中文
@Test
void toSimple(){
String original = "李白乘舟將欲行,忽聞岸上踏歌聲。|桃花潭水深千尺,不及汪倫送我情。";
String result = ZhConverterUtil.toSimple(original);
System.out.println(result);
Assertions.assertEquals("李白乘舟將欲行,忽聞岸上踏歌聲。|桃花潭水深千尺,不及汪倫送我情。", result);
}
// 簡(jiǎn)體中文轉(zhuǎn)繁體中文
@Test
void toTraditional(){
String original = "李白乘舟將欲行,忽聞岸上踏歌聲。|桃花潭水深千尺,不及汪倫送我情。";
String result = ZhConverterUtil.toTraditional(original);
Assertions.assertEquals("李白乘舟將欲行,忽聞岸上踏歌聲。|桃花潭水深千尺,不及汪倫送我情。", result);
}
}
在左側(cè)的數(shù)據(jù)轉(zhuǎn)換組件中,選擇“數(shù)據(jù)清洗轉(zhuǎn)換”,拖至中央的流程繪制區(qū),雙擊進(jìn)入配置階段。
因?yàn)樵磾?shù)據(jù)表中的 title
、 content
以及 author
這三個(gè)字段值是繁體中文,所以針對(duì)這三個(gè)字段設(shè)置自定義的規(guī)則:繁體中文轉(zhuǎn)為簡(jiǎn)體中文,下一步點(diǎn)擊保存對(duì)所有數(shù)據(jù)記錄進(jìn)行轉(zhuǎn)換即可。
- 庫(kù)表輸出:ClickHouse
在左側(cè)的輸出組件中,選擇“庫(kù)表輸出”,拖至中央的流程繪制區(qū),雙擊進(jìn)入配置階段。
第一步:選擇我們配置好的ClickHouse數(shù)據(jù)源。
第二步:可從表中讀取到各個(gè)字段的定義,支持添加、刪除字段、綁定規(guī)則。
最后通過(guò) 流程線
將開(kāi)始、庫(kù)表輸入、數(shù)據(jù)清洗轉(zhuǎn)換、庫(kù)表輸出、結(jié)束組件分別連接起來(lái),數(shù)據(jù)通過(guò)自定義的規(guī)則轉(zhuǎn)換與遷移的可視化配置便告完成,Done~
運(yùn)行流程
保存流程,運(yùn)行流程;之后可查看對(duì)應(yīng)的流程日志與轉(zhuǎn)換日志,并可視化監(jiān)控遷移進(jìn)度。
問(wèn)題記錄
- 數(shù)據(jù)轉(zhuǎn)換過(guò)程報(bào)錯(cuò)
問(wèn)題描述: 在 ETLCloud
的日志中發(fā)現(xiàn)錯(cuò)誤, Caused by: java.lang.ClassNotFoundException: com.github.houbb.heaven.support.instance.impl.Instances
問(wèn)題分析:在 SpringBoot
結(jié)合 IDEA
與 Maven
中開(kāi)發(fā)時(shí),我們僅僅引入了一個(gè)依賴: opencc4j
,但是實(shí)際上觀察外部依賴庫(kù)時(shí)發(fā)現(xiàn)還有另外兩個(gè)依賴: heaven
與 nlp-common
。
解決方法:將 opencc4j-1.8.1.jar
、 heaven-0.2.0.jar
與 nlp-common-0.0.5.jar
這個(gè)三個(gè) jar
包都上傳到 ETLCloud
的 /usr/tomcat/webapps/ROOT/WEB-INF/lib
目錄下,重新更新 ETLCloud
配置、重啟 ETLCloud
服務(wù)。
[root@etl ~]# docker cp /opt/heaven-0.2.0.jar de63b29c71d0:/usr/tomcat/webapps/ROOT/WEB-INF/lib
Successfully copied 304kB to de63b29c71d0:/usr/tomcat/webapps/ROOT/WEB-INF/lib
[root@etl ~]# docker cp /opt/nlp-common-0.0.5.jar de63b29c71d0:/usr/tomcat/webapps/ROOT/WEB-INF/lib
Successfully copied 1.97MB to de63b29c71d0:/usr/tomcat/webapps/ROOT/WEB-INF/lib
Note: Jar
包可以從阿里云鏡像倉(cāng)庫(kù)查找下載: https://developer.aliyun.com/mvn/search
,或者到本地開(kāi)發(fā)環(huán)境的的 .m2\repository\com\github\houbb
目錄下查找。
總結(jié)
以上介紹了如何通過(guò) ETLCloud
強(qiáng)大的自定義規(guī)則功能完成對(duì)數(shù)據(jù)的清洗轉(zhuǎn)換功能,實(shí)現(xiàn)了表字段值從繁體中文到簡(jiǎn)體中文的轉(zhuǎn)換,以下兩點(diǎn)要注意:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-682268.html
- 自定義規(guī)則是附屬于某個(gè)流程的;
- 第三方的
Jar
包依賴在數(shù)量上要完整。
Reference
- ETLCloud官方文檔
- ClickHouse官方文檔
- opencc4j官方文檔
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-682268.html
到了這里,關(guān)于基于ETLCloud的自定義規(guī)則調(diào)用第三方j(luò)ar包實(shí)現(xiàn)繁體中文轉(zhuǎn)為簡(jiǎn)體中文的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!