国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Springboot整合ETL引擎Kettle的使用

這篇具有很好參考價值的文章主要介紹了Springboot整合ETL引擎Kettle的使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

簡介

ETL是英文Extract-Transform-Load的縮寫,用來描述將數(shù)據(jù)從源端經(jīng)過抽取(extract)、轉(zhuǎn)換(transform)、加載(load)至目的端的過程,它能夠?qū)Ω鞣N分布的、異構(gòu)的源數(shù)據(jù)(如關(guān)系數(shù)據(jù))進行抽取,按照預(yù)先設(shè)計的規(guī)則將不完整數(shù)據(jù)、重復(fù)數(shù)據(jù)以及錯誤數(shù)據(jù)等“臟"數(shù)據(jù)內(nèi)容進行清洗,得到符合要求的“干凈”數(shù)據(jù),并加載到數(shù)據(jù)倉庫中進行存儲,這些“干凈”數(shù)據(jù)就成為了數(shù)據(jù)分析、數(shù)據(jù)挖掘的基石。

kettle是一個開源ETL工具。kettle提供了基于java的圖形化界面,使用很方便。kettle提供了基于 JAVA的腳步編寫功能,可以靈活地自定義ETL過程,使自行定制、批量處理等成為可能,這才是一個程序員需要做的工作,而不僅是象使用word一樣操作 kettle用戶界面。

springboot kettle,etl,數(shù)據(jù)挖掘,數(shù)據(jù)倉庫

環(huán)境集成:

參考:java集成kettle教程(附示例代碼)_kettle java_成偉平2022的博客-CSDN博客

代碼:

pom.xml添加:

<!--mysql數(shù)據(jù)庫鏈接驅(qū)動以及連接池-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.11</version>
        </dependency>
<!-- kettle 工具本地jar包加載 -->
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-core</artifactId>
            <version>8.2.0.7-719</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/kettle-core-8.2.0.7-719.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-engine</artifactId>
            <version>8.2.0.7-719</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/kettle-engine-8.2.0.7-719.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>metastore</artifactId>
            <version>8.2.0.7-719</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/metastore-8.2.0.7-719.jar</systemPath>
        </dependency>
        <!--kettle需要用到的其它依賴-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-vfs2</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>17.0</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6.12</version>
        </dependency>
@RestController
@RequestMapping("${application.admin-path}/etl-kettl")
//@Api(tags = "ETL-Kettle的demo接口")
public class KettleDemoContrllor {
	@Resource
	KettleService kettleService;

	@GetMapping("/execKtr")
	//@ApiOperation("執(zhí)行ktr文件")
	private Object runKtr(String filename) throws Exception {
		return R.buildOkData(kettleService.runTaskKtr(filename,null).toString());
	}

	@GetMapping("/execKjb")
	//@ApiOperation("執(zhí)行kjb文件")
	private Object runKjb(String filename) throws Exception {
		return R.buildOkData(kettleService.runTaskKjb(filename, null).toString());
	}
}
public interface KettleService {
    /**
     * 開始執(zhí)行ETL任務(wù)(ktr文件)
     *
     * @param taskFileName 執(zhí)行的任務(wù)文件名(ktr)
     * @param params 執(zhí)行任務(wù)輸入的參數(shù)
     * @return 運行結(jié)果
     * @throws Exception 沒有找到配置文件,Kettle的運行異常不會拋出
     */
    Object runTaskKtr(String taskFileName, Map<String, String> params) throws Exception;
    /**
     * 開始執(zhí)行ETL任務(wù)(kjb文件)
     *
     * @param taskFileName 執(zhí)行的任務(wù)文件名(kjb)
     * @param params 執(zhí)行任務(wù)輸入的參數(shù)
     * @return 運行結(jié)果
     * @throws Exception 沒有找到配置文件,Kettle的運行異常不會拋出
     */
    Object runTaskKjb(String taskFileName, Map<String, String> params) throws Exception;
}
@Service
public class KettleServiceImpl implements KettleService {

    @Value("${kettle.script.path}")
    private String kettleScriptPath;

    private static final Logger logger = LoggerFactory.getLogger("kettle-service-log");

    private final List<KtrMeta> KTR_METAS = new ArrayList<>();
    private final List<KjbMeta> KJB_METAS = new ArrayList<>();

    private List<String> getFiles(String path, String subName) {
        List<String> files = new ArrayList<>();
        File file = new File(path);
        File[] tempList = file.listFiles();
        if (tempList == null){
            return files;
        }
        for (File value : tempList) {
            if (value.isFile()) {
                if (Objects.equals(value.toString().substring(value.toString().length() - 3), subName)) {
                    files.add(value.getName());
                }
            }
        }
        return files;
    }

    //采用單列模式,項目啟動時加載環(huán)境,加載所有的轉(zhuǎn)換配置、任務(wù)配置,后續(xù)執(zhí)行就會快一點
    //@PostConstruct
    public void init() throws KettleException {
        logger.info("----------------------開始初始化ETL配置------------------------");
        KettleEnvironment.init();
        List<String> ktrFiles = getFiles(kettleScriptPath, "ktr");
        List<String> kjbFiles = getFiles(kettleScriptPath, "kjb");
        logger.info("需要加載的轉(zhuǎn)換為:" + ktrFiles.toString());
        logger.info("需要加載的任務(wù)為:" + kjbFiles.toString());
        logger.info("----------------------開始加載ETL配置--------------------------");
        for (String ktrFile : ktrFiles) {
            KtrMeta ktrMeta = new KtrMeta();
            ktrMeta.setName(ktrFile);
            ktrMeta.setTransMeta(new TransMeta(kettleScriptPath + ktrFile));
            KTR_METAS.add(ktrMeta);
            logger.info("成功加載轉(zhuǎn)換配置:" + ktrFile);
        }
        for (String kjbFile : kjbFiles) {
            KjbMeta kjbMeta = new KjbMeta();
            kjbMeta.setName(kjbFile);
            kjbMeta.setJobMeta(new JobMeta(kettleScriptPath + kjbFile, null));
            KJB_METAS.add(kjbMeta);
            logger.info("成功加載任務(wù)配置:" + kjbFile);
        }
        logger.info("----------------------全部ETL配置加載完畢-----------------------");
    }


    @Override
    public Object runTaskKtr(String ktrFileName, Map<String, String> params) {
        logger.info("開始執(zhí)行轉(zhuǎn)換:" + ktrFileName);
        TransMeta transMeta = null;
        for (KtrMeta ktrMeta : KTR_METAS) {
            if(Objects.equals(ktrFileName,ktrMeta.getName())){
                transMeta = ktrMeta.getTransMeta();
                break;
            }
        }
        //如果在緩存的列表里面沒找到需要自信的配置,嘗試手動加載
        try {
            if (transMeta == null) {
                logger.warn("資源池沒有找到配置文件:" + ktrFileName+"  嘗試二次加載!");
                KettleEnvironment.init();
                transMeta = new TransMeta(kettleScriptPath + File.separator + ktrFileName);
                if(transMeta==null) throw new RuntimeException("未找到需要執(zhí)行的轉(zhuǎn)換配置文件:");
            }
            Trans trans = new Trans(transMeta);
            if (params != null) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    trans.setParameterValue(entry.getKey(), entry.getValue());
                }
            }
            //trans.prepareExecution(null);
            //trans.startThreads(); //啟用新的線程加載
            trans.execute(null);
            trans.waitUntilFinished();
            return trans.getResult();
        }catch (Exception e)
        {
            e.printStackTrace();
            return e.getMessage();
        }

    }

    @Override
    public Object runTaskKjb(String objFileName, Map<String, String> params) throws Exception {
        logger.info("開始執(zhí)行任務(wù):" + objFileName);
        JobMeta jobMeta = null;
        for (KjbMeta kjbMeta : KJB_METAS) {
            if(Objects.equals(objFileName,kjbMeta.getName())){
                jobMeta = kjbMeta.getJobMeta();
            }
        }
        try {
            if (jobMeta == null) {
                logger.warn("資源池沒有找到配置文件:" + objFileName+"  嘗試二次加載!");
                KettleEnvironment.init();
                jobMeta = new JobMeta(kettleScriptPath + File.separator + objFileName,null);
                if(jobMeta==null) throw new RuntimeException("未找到需要執(zhí)行的任務(wù)配置文件:"+objFileName);
            }
            Job job = new Job(null, jobMeta);
            if (params != null) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    job.setParameterValue(entry.getKey(), entry.getValue());
                }
            }
            job.start();
            job.waitUntilFinished();
            return job.getResult();
        }catch (Exception e)
        {
            e.printStackTrace();
            return e.getMessage();
        }

    }
}
@Data
public class KtrMeta {
	private TransMeta transMeta;
	private String name;
}
@Data
public class KjbMeta {
	private JobMeta jobMeta;
	private String name;
}

總結(jié):

集成后感覺沒什么必要集成到項目里面去。關(guān)鍵還是需要學(xué)會工具的使用,以便進行數(shù)據(jù)收集與治理。

參考:1_ETL和Kettle概述_嗶哩嗶哩_bilibili

下載: kettle工具下載文章來源地址http://www.zghlxwxcb.cn/news/detail-629334.html

到了這里,關(guān)于Springboot整合ETL引擎Kettle的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • kettle從入門到精通 第五十三課 ETL之kettle MQTT/RabbitMQ consumer實戰(zhàn)

    kettle從入門到精通 第五十三課 ETL之kettle MQTT/RabbitMQ consumer實戰(zhàn)

    1、上一節(jié)課我們學(xué)習(xí)了MQTT producer 生產(chǎn)者步驟,MQTT consumer消費者步驟。該步驟可以從支持MRQTT協(xié)議的中間件獲取數(shù)據(jù),該步驟和kafka consumer 一樣可以處理實時數(shù)據(jù)交互,如下圖所示: ?2、雙擊步驟打開MQTT consumer 配置窗口,如下圖所示: Step name: 自定義步驟名稱。 Transformat

    2024年04月28日
    瀏覽(40)
  • 你還在用Kettle嗎?試試這款ETL工具

    你還在用Kettle嗎?試試這款ETL工具

    當(dāng)今時代,數(shù)字化轉(zhuǎn)型已經(jīng)成為企業(yè)發(fā)展的必由之路。數(shù)字化轉(zhuǎn)型不僅可以提高企業(yè)的效率和生產(chǎn)力,還可以提高企業(yè)的競爭力和市場份額。在數(shù)字化轉(zhuǎn)型的過程中,數(shù)據(jù)集成是至關(guān)重要的一步,可以幫助企業(yè)在數(shù)字化轉(zhuǎn)型中實現(xiàn)更高效和可靠的數(shù)據(jù)服務(wù)。 在國內(nèi)沒有更好的

    2024年02月09日
    瀏覽(20)
  • 大數(shù)據(jù)ETL工具對比(Sqoop, DataX, Kettle)

    大數(shù)據(jù)ETL工具對比(Sqoop, DataX, Kettle)

    前言 在實習(xí)過程中,遇到了數(shù)據(jù)庫遷移項目,對于數(shù)據(jù)倉庫,大數(shù)據(jù)集成類應(yīng)用,通常會采用 ETL 工具輔助完成,公司和客戶使用的比較多的是 Sqoop , DataX 和 Kettle 這三種工具。簡單的對這三種ETL工具進行一次梳理。 ETL工具,需要完成對源端數(shù)據(jù)的抽?。╡xat), 交互轉(zhuǎn)換(

    2024年02月11日
    瀏覽(27)
  • 關(guān)于Kettle ETL java腳本編寫遇到的一些問題記錄

    關(guān)于Kettle ETL java腳本編寫遇到的一些問題記錄

    使用方法**logBasic()**參數(shù)必須是字符串 這部分內(nèi)容會在ETL的日志窗口顯示 1.獲取上個節(jié)點傳輸?shù)臄?shù)據(jù) 可以直接在左側(cè)雙擊獲取 2.全局參數(shù)獲取 在啟動運行的變量設(shè)置參數(shù) 在java代碼中獲取方式 3.獲取當(dāng)前節(jié)點參數(shù) 在當(dāng)前窗口下方有個 參數(shù) Tab頁,在這里設(shè)置 在java代碼中獲取

    2024年02月12日
    瀏覽(25)
  • Kettle Local引擎使用記錄(一)(基于Kettle web版數(shù)據(jù)集成開源工具data-integration源碼)

    Kettle Local引擎使用記錄(一)(基于Kettle web版數(shù)據(jù)集成開源工具data-integration源碼)

    在前面對 data-integration 做了一些簡單了解,從部署到應(yīng)用,今天嘗試把后端運行作業(yè)代碼拎出來,去真正運行一下,只有實操之后才會有更深刻的認(rèn)識,有些看著簡單的功能,實操過程中會遇到很多問題,這個時候你的想法也會發(fā)生改變,所以很多時候為什么開發(fā)人員痛恨做

    2024年02月02日
    瀏覽(30)
  • 【數(shù)據(jù)預(yù)處理】基于Kettle的字符串?dāng)?shù)據(jù)清洗、Kettle的字段清洗、Kettle的使用參照表集成數(shù)據(jù)

    【數(shù)據(jù)預(yù)處理】基于Kettle的字符串?dāng)?shù)據(jù)清洗、Kettle的字段清洗、Kettle的使用參照表集成數(shù)據(jù)

    ?? 本文選自專欄:AI領(lǐng)域?qū)?從基礎(chǔ)到實踐,深入了解算法、案例和最新趨勢。無論你是初學(xué)者還是經(jīng)驗豐富的數(shù)據(jù)科學(xué)家,通過案例和項目實踐,掌握核心概念和實用技能。每篇案例都包含代碼實例,詳細(xì)講解供大家學(xué)習(xí)。 ??????本專欄

    2024年02月03日
    瀏覽(31)
  • Springboot整合Flowable流程引擎

    Springboot整合Flowable流程引擎

    Flowable是一個開源的工作流引擎,它基于Activiti引擎進行發(fā)展,F(xiàn)lowable主要用于為業(yè)務(wù)流程管理(BPM)和工作流的設(shè)計、操作、監(jiān)控提供支持。 這類表在Flowable中主要提供存儲通用類型數(shù)據(jù)的功能,如流程名稱,創(chuàng)建時間等。如下是通用表的主要成員: act_ge_bytearray:存儲二進

    2024年02月05日
    瀏覽(18)
  • springboot整合ES索引引擎

    springboot整合ES索引引擎

    1.創(chuàng)建springboot工程并導(dǎo)入相關(guān)的依賴 2.3.12.RELEASE 2.創(chuàng)建一個配置類,返回 RestHighLevelClient 修改一下版本 創(chuàng)建路徑config包下的ESconfig類 3.測試 在Test中測試 結(jié)果: 判斷索引是否存在 結(jié)果: 刪除索引 結(jié)果: 在索引中添加文檔 在entity包創(chuàng)建celebrity實體類 結(jié)果: 根據(jù)id查詢文檔內(nèi)容 結(jié)

    2024年02月11日
    瀏覽(15)
  • 【Springboot】SpringBoot基礎(chǔ)知識及整合Thymeleaf模板引擎

    【Springboot】SpringBoot基礎(chǔ)知識及整合Thymeleaf模板引擎

    ??博客x主頁:己不由心王道長??! ??文章說明:spring?? ?系列專欄:spring ??本篇內(nèi)容:對SpringBoot進行一個入門學(xué)習(xí)及對Thymeleaf模板引擎進行整合(對所需知識點進行選擇閱讀呀~)?? ??每日一語:在人生的道路上,即使一切都失去了,只要一息尚存,你就沒有絲毫理

    2023年04月23日
    瀏覽(25)
  • SpringBoot整合模板引擎Thymeleaf(4)

    SpringBoot整合模板引擎Thymeleaf(4)

    本文原創(chuàng)作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 在之前的教程中,我們介紹了Thymeleaf的基礎(chǔ)知識。在此,以案例形式詳細(xì)介紹Thymeleaf的基本使用。 要點概述: 1、在static下創(chuàng)建css文件夾用于存放css文件 2、在static下創(chuàng)建img文件夾用于存放圖片文件 請在pom.xml文

    2024年02月10日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包