zoukankan      html  css  js  c++  java
  • 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 结果展示

  • 相关阅读:
    MySQL锁
    mysql服务性能优化—my.cnf配置说明详解
    springmvc请求参数获取的几种方法
    Linux mysql 添加远程连接
    Linux 操作 mysql
    Linux 安装 mysql 转 http://www.cnblogs.com/fnlingnzb-learner/p/5830622.html
    linux 下 安装nginx
    dubbo 实战总结
    分布式事务的几种方式
    精巧好用的DelayQueue 转
  • 原文地址:https://www.cnblogs.com/qianslup/p/14226492.html
Copyright © 2011-2022 走看看