kettle之excel上传数据库

一、为什么选择kettle

在将excel中的数据上传到SQL数据库,现在常用的自动化是写python代码,可以查看:https://www.cnblogs.com/qianslup/p/12567284.html

或者手动插入到数据库中。

使用python代码,缺点有:

  • 需要掌握pyhton,对于大量不同表格表格上传数据库,维护起来则显得极其繁琐;
  • 同时、对字段的连接,拼接等操作需要写代码。

而使用kettle则可以解决python的两个缺点;即使没有编程基础的人,也可以通过图标、拖拽等操作完成这些操作;并可以定时、发送邮件等操作。

如果固有的功能无法满足,也可以书写java脚本,自定义操作。总之、在将Excel上传到数据库,或将Excel的字段简单处理之后上传到数据库;kettle的友善度远高于python。

二、常用操作

会对一些操作谈一些自己的看法与重要性(满分5星)和其他操作的对比,主要这里的评分只代表自己在工作中的看法,换一个工作场景的评分重要性可能会有颠倒性改变,

其他操作的对比主要有SQL语句,Excel、Power Query等。

2.1 常规操作

就以下表中的一些操作简单的说明下。

2.2 步骤说明

2.2.1 Excel底层数据

2.2.2 字段选择

选择或者移除字段里的字;可以设置字段的元数据:类型、长度、精度

重要性:2星。

可代替性较高,如果只是改名与移除字段;这一步操作可以在最后一步上传数据库时被代替。长度与精度基本上使用不到。

对应SQL语句

select name,xing,ming,sex as 'gender',[date],string,splite_text,splite_row 
into #字段选择
from  test.kettle.转换

2.2.3 Concat fields

将字段进行拼接并且生成一个新字段

重要性:3星

对应SQL语句

select 
name,xing,ming,gender,[date],string,splite_text,splite_row,
concat(xing,'-',ming) as 'xing-ming'
into #concat_fields
from #字段选择

2.2.4 值映射

将字段的值映射为为另外的值

 重要性:3星

对应SQL语句

select 
name,xing,ming,gender,[date],string,splite_text,splite_row,[xing-ming],
CASE WHEN gender='1' THEN 'male' 
     WHEN gender='2' THEN 'female'
         WHEN gender is null then 'male'
         else 'eunch' end as 'sex_2'
into #值映射
from #concat_fields

2.2.5 增加常量

给记录增加一个或多个常量

 重要性:2星

对应SQL语句

select *,'春秋' AS 'dynasty'
into #增加常量
from #值映射

2.2.6 将字段设置为常量

重要性:1 星

对应SQL 语句

select name,xing,ming,gender,[date],string,splite_text,splite_row,[xing-ming],
'战国' AS 'dynasty'
into #将字段值设置为常量
from #增加常量

2.2.7 增加序列

重要性:3 星

对应SQL 语句

Alter Table #增加常量 Add id Int Identity(1, 10)
;
select *  into #增加序列  from #增加常量

2.2.8 计算器

通过执行简单的计算创建一个新字段

重要性:3 星

对应SQL 语句

select *,year([date]) as 'year',concat(xing,'_',ming) as 'xing_ming' 
into #计算器
from #增加序列 

注意度字段处理了,可部分替代Concat fields。

2.2.9 剪切字符串

通过执行简单的计算创建一个新字段

重要性:3星

对应SQL 语句

select *,left([string],1) as [first]
into #剪切字符串 
from  #计算器

2.2.10 字符串替换

将某个字符串替换为其他的字符串

重要性:4星

这个步骤的重要性高的原因是人为原因,总有一些人在填写数据时喜欢用空格代替空值,需要将空格剔除掉。

对应SQL 语句

select *,REPLACE(string, ' ', '') as no_blank 
into #字符串替换
from #剪切字符串 

2.2.11 字符串操作

重要性:3星

对应SQL 语句

select * into #字符串操作
from #字符串替换 
;
update  #字符串操作 set [first] = LOWER([first]);

可以进行多种操作,我这只演示转化为小写。

2.2.12 唯一行 (哈希值)

删除数据流重复的行

相当于排序记录+去除重复记录,但是实现原理不同。

唯一行(哈希值)执行效率更高

重要性:4星

对应SQL 语句,使用开窗函数相对简单一点。 

SELECT 
name,xing,ming,gender,[date],string,splite_text,splite_row,[xing-ming],sex_2,dynasty,id,[year],xing_ming,[first],no_blank
into #唯一行_哈希值
from 
(
select 
name,xing,ming,gender,[date],string,splite_text,splite_row,[xing-ming],sex_2,dynasty,id,[year],xing_ming,[first],no_blank,
row_number() OVER (PARTITION BY name,xing,ming,gender,[date],string,[xing-ming],sex_2,dynasty,[year],xing_ming,[first],no_blank ORDER BY [id])
as 'id排序'
from  #字符串操作 
) as a where id排序 = 1

2.2.13 排序记录

基于字段值,对值进行排序

一般和其他操作的预处理步骤

重要性:2星

对应SQL 语句

SELECT * from  #唯一行_哈希值 order by id

2.2.14 去除重复记录

删除数据流重复的行,前提是排好序,否则只删除连续的重复行。

重要性:4星

对应SQL 语句,使用开窗函数相对简单一点。 

SELECT 
name,xing,ming,gender,[date],string,splite_text,splite_row,[xing-ming],sex_2,dynasty,id,[year],xing_ming,[first],no_blank
into #去除重复行
from 
(
select 
name,xing,ming,gender,[date],string,splite_text,splite_row,[xing-ming],sex_2,dynasty,id,[year],xing_ming,[first],no_blank,
row_number() OVER (PARTITION BY name ORDER BY [id])
as 'id排序'
from  #唯一行_哈希值 
) as a where id排序 = 1

2.2.15 拆分字段

按照分隔符将字段进行拆分

重要性:5星

打5星全靠同行衬托,SQL语句中没有根据某个字符串进行划分,如果想实现这个目的,需要自定义函数。非常的不友好。

自定义可以参考:https://www.cnblogs.com/qianslup/p/14232972.html

对应SQL 语句:

select *,
qiansl.splitl(splite_text,'_',1) as 'test_1',
qiansl.splitl(splite_text,'_',2) as 'test_2',
qiansl.splitl(splite_text,'_',3) as 'test_3'  from #去除重复行

对应的Excel操作:

2.2.16 数值范围

重要性:3星

对应SQL 语句,使用开窗函数相对简单一点。

select *,
case when [year] <2000 then '2000年以前' 
          when [year]>= 2000 and [year]< 2020 THEN '2000-2020'
            WHEN [year] >= 2020 THEN '2020年以后' 
            else 'unkonwn' end as '时间段'
INTO #数值范围            
from #拆分字段

2.2.17 数值范围

重要性:5星

对应SQL 语句;从这一步一样可以起别名,剔除不要的字段。可部分替代“字段选择”

SELECT 
name,xing,ming,gender as 'sex',[date],string,splite_text,splite_row,[xing-ming],sex_2,dynasty,id,[year],xing_ming,[first],no_blank,text_1,text_2,text_3,[时间段]
into result
from #数值范围    

三、行列转化

行专列、列转行这个操作最好能够知道,kettle里面可以操作,感觉用到的场景不多,所以就不多做介绍。

涉及到的步骤有:行转列、列转行、行扁平化、列拆分为多行

其他可以实现行列转化的有SQL Server:https://www.cnblogs.com/qianslup/p/11001064.html    拉到最后可以看到。

Powert Query: https://www.cnblogs.com/qianslup/p/12397365.html

Hive好像也有类似功能,没有研究过;MY SQL 没有专门的语句,强行写也可以写出来。 

四、常用流控制

 

从多个数据源读取数据,筛选之后上传到数据库,并留下Excel底本。

4.1 追加流

将有且仅有两个数据源合并为一个数据源;如果有3个数据源需要合并2次,有n(n>=2)个数据源,需要合并n-1次。

4.2 过滤记录

流进行筛选过滤操作,语句接近SQL语句

4.3 输出

表输出之后又连了Microsoft Excel 输出;两个输出的内容相同。

4.4 结果展示

原文地址:https://www.cnblogs.com/qianslup/p/14226492.html