麦粉社区
>
帖子详情

[数据准备] 一招解决:基于ETL的多Excel文件批量入库实践

动态中心 发表于 6 小时前
发表于 6 小时前

在业务场景中,经常需要将多个Excel文件定时整合并同步至数据库中。如果依赖传统的Excel导入模板或回写批量导入方式,往往需要手动重复操作,耗时费力。有没有更加高效的方式,可以实现定时、批量、自动化的数据整合与导入呢?本文将以ETL方案为例,手把手带大家从环境搭建到完成一个简易高效的自动化数据入库流程。


 


环境搭建:


在平常企业环境中都会有搭建ftp服务器的,在使用的时候需要保证SmartBI和ftp服务的网络连通可用,并有对应文件的读写权限。


若是自己本地搭建ftp服务器可参考(windows版):https://blog.csdn.net/qq_34147601/article/details/85841334


环境搭建完成之后,可将需要读取的文件上传到ftp服务器上:


 


IMG_256IMG_257


ETL使用FTP获取到目标文件:


在自助etl中配置ftp节点保证能够正常读取到指定文件:


1、需要在ftp节点中按照当前实际的ftp服务器的设置进行配置节点信息。


2、因为后续需要获取多个文件,文件名称不一样,所以读取的文件名应当设置为参数形式动态获取,可基于文件命名方式进行设置适当的参数,如当前想要获取指定目录下的所有后缀为.xlsx的文件,则配置的为:{fileName}.xlsx,此处的fileName是文件名参数。


3、设置后可在etl的参数管理中设置实际的参数值进行测试。


4、配置完成后可运行ftp节点确保当前配置能够正常读取到指定文件数据。


 


IMG_258


ftp节点使用:https://wiki.smartbi.com.cn/pages/viewpage.action?smt_poid=43&pageId=114996982


注:在新建资源的时候etl界面的参数管理显示为灰色无法选中,需要对当前etl资源保存后重新打开才可以设置。


 


IMG_259


 


通过如上设置能够实现对ftp服务器上的指定文件进行读取,读取完成之后可对读取的数据进行数据的预处理及目标源的入库,由于是多个文件合并所有此处的目标源节点应当选择插入/更新节点基于主键实现数据的合并:


 


IMG_260IMG_261


 


作业流实现对多个文件的读取写入:


可结合作业流的foreach循环器实现对于多个excel文件的读取写入:


foreach循环器使用参考:https://wiki.smartbi.com.cn/pages/viewpage.action?smt_poid=43&pageId=151789444


此处需要选择为ftp文件枚举器,配置ftp服务配置,在循环资源中选择做好的etl资源,并做好参数的映射。


 


IMG_262IMG_263


 


这里需要注意的是,如果当前文件中有多个sheet页,但是实际上仅只有一个sheet页有内容,这时候如果有将sheet页也作为参数的话,在循环ftp文件的时候也会对没有内容的sheet页进行循环枚举,可能会导致作业流执行失败:


 


IMG_264IMG_265IMG_266


若遇到此类问题可以参考如下方案进行解决:


1、通过设置固定值读取固定的sheet页或文件仅包含有数据的sheet页,从而规避此问题。


IMG_267


 


2、设置循环器忽略错误继续运行,数据能够正常写入但是该节点的整体状态还是失败的,若后续还有其他节点是不会向下执行的,故不推荐。


 


IMG_268


 


如果后续有需要定时去实现对多excel文件的批量读取入库,则可以通过对作业流设置定时任务实现即可。


 


场景实战:


在平常的业务使用中,可能有些做好的报表,希望每次定时导出之后,这些报表的导出可能是基于参数进行导出的多个文件也想要实现多个文件的批量整合导入,需要怎么实现呢?


当我们拿到业务需求的时候,可以先一步一步将需求拆分,然后找到对应的方案进行解决。


 


需求分析:首先考虑是否能够直接基于etl便可以实现,etl的关系源可以是来源于数据表、数据查询、数据集等,如果直接可以通过数据集或sql查询获取到对应的数据,可使用etl结合作业流进行实现,如果有特殊的场景需要依赖于报表的数据导出才能够实现,再按照实际的需求进行拆分。


 


需求拆分:


拆分1:需要实现报表定时导出可以通过系统的计划任务功能进行实现


拆分2:由于多excel文件是要在ftp服务器中去获取的,在计划任务中不能直接选择导出到ftp服务器上,如何解决?


答:可以通过部署扩展包的方式进行实现:https://wiki.smartbi.com.cn/pages/viewpage.action?smt_poid=43&pageId=142980421


拆分3:如何实现报表导出之后就去调用执行作业流呢?


 


答:有两种方案:


1、设置定时任务,使得作业流的定时计划满足于报表导出完成导出之后,再定时执行,此时读取的就是导出之后的文件了。


2、通过自定义任务调用作业流的执行接口进行实现。


第一种方案需要对报表导出时间和定时计划时间做对应的预估设置,需要结合实际业务场景进行设置,本文主要会讲解第二种方式的实现。


当我们将需求一步步拆分完成之后,接下来就是实践了。


步骤1:导入扩展包并启用



 


 


步骤2:设置计划任务导出到ftp服务器的指定目录,该目录需要和作业流的ftp读取的目录一致


 


IMG_270


 


测试运行检查ftp服务器指定目录是否能够正常导出报表:


 


IMG_271


 


能够正常导出,说明当前的配置是没有问题的。


步骤3:计划任务实现报表导出之后调用作业流的执行


首先需要将原来的报表导出任务转换为自定义任务:


 


IMG_272


IMG_273


 


保存后可对任务进行运行,检测是否能够正常导出报表资源:


 


IMG_274


接下来便是在导出报表之后去调用作业流的执行了,但是如果是使用http请求去调用开放的api接口又会显得非常繁琐,我们还有一种更为简单的方法:


 


IMG_275


 


可以获取对应的计划id在自定义任务中去实现对该计划的调用,调用的api可参考:


 


IMG_276


 


api获取可参考:https://wiki.smartbi.com.cn/api/javaapi/


然后只需要在新建的计划任务中去添加对应调用逻辑就可以了:


 


IMG_277IMG_278


任务创建好之后可调用该任务进行测试:


 


IMG_279IMG_280


 


当发现可正常调用对应是作业流及正常写入数据,说明当前需求就已经实现了。若需要定时执行可再对当前任务创建计划就可以实现了。


当前案例需要注意事项有:


1、etl的读取数据开始行号需要基于最终读取导入的excel文件进行调整,保证能够正常读取到数据。


2、任务导出的报表sheet页名称会存在不一样的情况,故前面说到的etl的sheet页名称也要做成参数形式。


 


IMG_281


 


3、当前设置了主键,数据会基于主键进行更新插入,但是文件过多会影响任务的执行效率建议定时清理该文件夹,防止文件过多任务执行很久,也可考虑为对应的文件夹目录编写自动清理脚本,本文不再演示。


 


 


阅读完成啦,来做个任务巩固下吧,答题可领取麦豆哦——>点击领取任务

高级模式
B Color Image Link Quote Code Smilies
您需要登录后才可以回帖 登录 | 立即注册

0回帖数 0关注人数 51浏览人数
最后回复于:6 小时前

社区

指南

AI

搜索

快速回复 返回顶部 返回列表