精华内容
下载资源
问答
  • 概述: 总job,分三步,第一:先清空目标表;...第三,根据第二步 生成的1、2、3...n的数据列,为每行都执行一次表插入,即实现分n次抽取数据插入。 在每次的执行中都根据变量,select 出对应的数据,进行表...

    概述:

    总job,分三步,第一:先清空目标表;

    第二,根据源表总的数据行,结合服务器配置 kettle每次能抽取插入多少行,算出需要分n次抽取,并生成1到n的序列值列表。
              ps:生成1、2、3...n 的数据列,然后把每个值赋值给变量var_page,   根据var_page的值分页查询。

    第三,根据第二步 生成的1、2、3...n的数据列,为每行都执行一次表插入,即实现分n次抽取数据插入。 

                在每次的执行中都根据变量,select 出对应的数据,进行表插入
                   eg: select  *

                         from  table

                         where rownum > (${var_page}-1) * 2000

                         and  rownum <  ${var_page} * 2000

     

     

     

     

    详细步骤:

    1.清空表

    省略

    2.根据源表总的数据行,结合服务器配置 kettle每次能抽取插入多少行,算出需要分n次抽取,并生成1到n的序列值列表

    eg:总行数 2W

       服务器kettle每次只能抽取 2k行

       需要抽取10次

       序列值列表 1 2 3 4 5 6...10

    2.0总览:

    2.1计算出要执行多少次

     

    SELECT ceiling(count(1)/2000) as p_max_page
    FROM src 

    PS:四舍五入 向上取值

    2.2选中字段,选中该执行频次字段

     

    2.3生成序列

    随便找个表,利用rownum 生成序列

     

    SELECT rownum as p_page
    from dwd_chaye_dakehuqudao
    where rownum <= ?

     

    PS:勾选替换变量,选择“从步骤插入数据” :

    2.4 选中序列字段

    PS: 这里 “”格式“” 这列要设置为   # , 不然会出现如下报错: 变量会增加小数位

    PS:要改成integer  类型的,不然会变成 1.0   2.0  3.0 .....

    2.5 复制记录到结果

    为了给以后步骤可用

     

    3.loop  循环执行 插入数据

    PS;勾选执行每行输入行

    3.1loop组件总览

     

    3.2 set var 设置变量 

    从第二步中获取序列值,复制给变量

     

    3.2.1 从结果获取记录

    3.2.2 赋值变量

     

    PS: 变量活动类型:  在父job中存活

     

    3.3 table input

    根据变量查询出  分页数据,插到目标表中

    3.3.1总览:

     

    3.3.2 表输入

     

    SELECT * 
    FROM src 
    UNPIVOT(
        data FOR index1 IN (签约金额,签约套数,签约面积)
    ) s
    where 1=1
    and rn > (${var_page}-1) *2000
    and rn <= ${var_page} *2000

     

     

    PS: 勾选 替换SQL中变量

     

    3.3.3 获取当前时间 (为目标表中 更新日期字段准备,不需要可省略)

     

    3.3.4 表输入

    正常选择对应表字段 对应即可

     

    以上完结。

    展开全文
  • 通过基础的数据库操作,在后期学习中多次使用从而方法不满足,抽取成工具 先是进行了条件查询,从而引出QueryHelper的工具类 QueryHelper:(为防止操作失误,选择传入类对象并赋予别名) 1.对问题进行分析即两个...

    通过基础的数据库操作,在后期学习中多次使用从而方法不满足,抽取成工具
    先是进行了条件查询,从而引出QueryHelper的工具类
    QueryHelper:(为防止操作失误,选择传入类对象并赋予别名)
    1.对问题进行分析即两个模块,①获取到hql语句②获取参数值

    2.对①进行细分 第一步 from子句必须有,放入构造方法。
          第二步 where子句 (1.n)写入方法addCondition(String condition, Object... params) {}
    ②同时导入参数(查询字段)
    if (parameters == null) {
    parameters = new ArrayList<Object>();
    }
    if (params != null) {
    for (Object param : params) {
    parameters.add(param);
    }
          第三步 order By .. desc/asc 排序方式addOrderByProperty(String property, String order) {}
    使用方式:
        QueryHelper queryHelper = new QueryHelper(Info.class, "i");//确定查询的对象类型
    if (info != null) {
    if (StringUtils.isNotBlank(info.getTitle())) {
    info.setTitle(URLDecoder.decode(info.getTitle(),"utf-8"));//重定向回来,条件处于被浏览器加密。揭秘呈现在浏览器上
    queryHelper.addCondition("i.title LIKE ?",
    "%" + info.getTitle() + "%"); //查询Info对应表的title字段,采用模糊查询的方式
    }
    }
    queryHelper.addOrderByProperty("i.createTime",
    QueryHelper.ORDER_BY_DESC);      //添加排序的依据和排序方式 已createTime列为标准排序 方式为降序
    pageResult = infoService.getPageResult(queryHelper,getPageNo(),getPageSize());//下面会说到

    下午
    上午遗留问题:查询条件的回显问题
    1.在页面跳转addUI.action和editUI.action时遗失查询条件
    2.跳转回listUI.action时。丢失查询条件

    解决方式:① Action 中维护一个 strName的String 对象;在进行增加和编辑时 保存需要的内容 如: strName = user.getName(); //在进行数据库操作前
    ② 在配置文件中当页面返回请求是list时 进行重定向。

    <result name="list" type="redirectAction">//类型重定向
    <param name="actionName">role_listUI</param>//跳转的action 
    <param name="role.name">${strName}</param>//保存查询条件的内容 并赋予给该显示的地方
    <param name="encode">true</param>//为防止中文乱码问题,请求提交进行密保即%155%等 格式
       </result>
    为了防止当前页数为5 而查询出来结果显示错误。在查询方法内加入$("#pageNo").val(1);!!

    问题:页面查询出来结果需要进行分页
    创建PageResult类 变量有 totalCount//结果总数 pageNo//当前页数 pageSize//页面大小 totalpageCount页面总数 items页面列表(数据保存处)
    配个上午的QueryHelper 查询出筛选后的内容 即query 返回一个PageResult对象 页面通过 pageResult.items 获取列表 再进行遍历即可。

    if(pageNo<1) pageNo = 1;
    //设置开头
    query.setFirstResult((pageNo-1)*pageSize);
    //设置每页最大数量
    query.setMaxResults(pageSize);
    //设置返回的列表
    List items = query.list();
    //获取总数
    Query countQuery = getSession().createQuery(queryHelper.getCountHql());
    if (parameters!=null) {
    for (int i = 0; i < parameters.size(); i++) {
    countQuery.setParameter(i, parameters.get(i));
    }
    } 
    Long totalCount = (Long)countQuery.uniqueResult();
    
    return new PageResult(totalCount, pageNo, pageSize, items);
    
    
    可以获取结果,编队JSP进行抽取在列表页面添加标签<jsp:include page="/common/pageNavigator.jsp"></jsp:include>。
    在JSP中可以不只一个代码块在抽取的列表下 进行<script type="text/javascript">代码块执行方法

    值得注意的是如何在抽取的JSP中被调用的JSP访问正确的action 可以在原有界面定义 list_url 常量 在公共页面只需调用document.forms[0].action = list_url;即可

    课下作业:对原有系统进行改造。把User 和 Role 进行相同的查询与操作!

    展开全文
  • 将MySQL中的数据进行分页抽取; 将分页抽取数据插入到另一个MySQL表中。 整体架构 第一步,build_query_page 查询所有的页码,将页码保存到结果; 第二步,set_values 从结果中获取页码,将页码设置为环境变量...
     
    

    需求:

    • 将MySQL中的数据进行分页抽取
    • 将分页抽取的数据插入到另一个MySQL表中。

    整体架构

    在这里插入图片描述

    • 第一步,build_query_page 查询所有的页码,将页码保存到结果;
    • 第二步,set_values 从结果中获取页码,将页码设置为环境变量;
    • 第三步,execute_by_page 从环境变量中获取页码,根据页码,循环获取每页数据并输出到表中。

    1.主流程

    transfer_table1_to_table2.kjb


    2.页数查询

    build_query_page.ktr

    2.1 input_page

    -- 每页30000条数据,查询页码
    SELECT
    	t.P_PAGE
    FROM (SELECT (@rowNum:=@rowNum+1) P_PAGE FROM t_kettle_test t, (select (@rownum :=0) ) b) t
    WHERE t.P_PAGE <= (SELECT CEIL(COUNT(*) / 30000) FROM t_kettle_test t)
    

    2.2 字段选择

    2.3 复制记录到结果字符串


    3.循环分页查询、插入

    loop_execute.kjb

    3.1 set_values.ktr

    3.1.1 get_page

    (从结果获取页码)

    3.1.2 set_param

    (将页码设置为环境变量)

    3.2 execute_by_page.ktr

    3.2.1 获取变量

    (获取之前设为环境变量的页码)

    3.2.2 query_by_page

    (根据页码分页查询数据)

    -- 每页30000条数据,查询数据
    SELECT t.* FROM (SELECT
    	(@rowNum:=@rowNum+1) rowNum, page.pageNum, t.*
    FROM t_kettle_test t, (select (@rownum :=0) ) row, (select ? pageNum) page) t
    WHERE t.rowNum > (t.pageNum - 1) * 30000 AND t.rowNum <= t.pageNum * 30000
    

    3.2.3 select_fields

    (筛选想要更新的字段)

    3.2.4 output_target

    (将查询到的数据输出到目标表里面)


    4.执行

    执行成功,结果如下所示:

    代码下载地址:
    https://download.csdn.net/download/qq_33204709/18714766





    参考地址:(文章略有改动)

    https://www.cnblogs.com/greyzeng/p/5524614.html

    展开全文
  • PQSQL_数据分页抽取

    2021-09-16 15:38:23
    分页抽取(启用并行,少日志) FOR I IN 1..page LOOP SQL_T := ' insert into /*+ append */ '||TABLE_TARGET||' nologging ( '||FIELD_NAME||') SELECT /*+paralle(16)*/ '||FIELD_NAME||' FROM (SELECT /*+paralle...
    create or replace procedure P_DATA_EXTRACT_0915 (TABLE_NAME in varchar2,START_DATE IN NUMBER,END_DATE IN NUMBER ) is
    
    TABLE_SOURCE NVARCHAR2(100) ;
    TABLE_TARGET NVARCHAR2(100) ;
    FIELD_NAME NVARCHAR2(100);
    MAX_DATE NUMBER;
    MIN_DATE NUMBER ;
    TOTAL_NUMBER NUMBER;
    SQL_T VARCHAR2(32000);
    page INTEGER;
    EXTRACT_number NUMBER :=2000000 ; --每次抽取量
    BEGIN_TIME date;
    END_TIME date;
    --TEST02 NVARCHAR2(100) :='a';
    begin
    
    --TEST
    
    --select max(ETL_DATE)  INTO TEST01 from data_event_oldods ;
    --DBMS_OUTPUT.put_line(TEST);
    --DBMS_OUTPUT.put_line(TEST01);
    --DBMS_OUTPUT.put_line(TEST02);
    
    BEGIN_TIME := SYSDATE;
    --1.编写源表和目标表
    TABLE_SOURCE := 'DATA_'||TABLE_NAME|| '_OLDODS'; -- 源表
    TABLE_TARGET := 'DATA_'||TABLE_NAME|| '_HQ';     -- 新表 别写反了!!!!
    DBMS_OUTPUT.put_line('源表和目标表:'||TABLE_SOURCE||'-'||TABLE_TARGET);
    
    --2.获取最大日期/最小日期/总数/抽取量/页数
    select   NVL(max(ETL_DATE),0) INTO MAX_DATE from data_event_oldods ;
    DBMS_OUTPUT.put_line('最大日期/最小日期:'||MAX_DATE||'-'||MIN_DATE);
    
    select  count(1) INTO TOTAL_NUMBER from data_event_oldods WHERE ETL_DATE BETWEEN   START_DATE  AND   END_DATE  ;
    DBMS_OUTPUT.put_line('总数:'||TOTAL_NUMBER );
    
    select ceil(TOTAL_NUMBER/EXTRACT_number) into page from dual;
    DBMS_OUTPUT.put_line('每次抽取数/页数:'||EXTRACT_number||'-'||page );
    
    
    
    --3.获取抽取字段名
    SELECT listagg(to_char(column_name),',') within group(order by column_name) INTO FIELD_NAME
    FROM 
    (
    SELECT COLUMN_NAME FROM  user_tab_columns where table_name =UPPER(TABLE_TARGET)
    INTERSECT
    SELECT COLUMN_NAME FROM  user_tab_columns where table_name =UPPER(TABLE_SOURCE)
    );
    DBMS_OUTPUT.put_line('抽取字段:'||FIELD_NAME);
    
    --4.分页抽取(启用并行,少日志)
    
    FOR I IN 1..page LOOP
    SQL_T :=
    '
     insert into /*+ append */ '||TABLE_TARGET||' nologging ( '||FIELD_NAME||')  
     SELECT /*+paralle(16)*/ '||FIELD_NAME||' 
     FROM
     (SELECT /*+paralle(16)*/ '||FIELD_NAME||' ,RW
     FROM
     (select /*+paralle(16)*/ '||FIELD_NAME||'  ,ROWNUM RW
     from  '||TABLE_SOURCE||'  
     WHERE ETL_DATE BETWEEN  '||START_DATE||' AND  '||END_DATE||' ORDER BY ROWID)
     WHERE RW <='||EXTRACT_number||' *'||i||')
     WHERE RW >'||EXTRACT_number||' * ('||i||'-1)
    ';
    
    DBMS_OUTPUT.put_line(SQL_T);
    execute immediate SQL_T;
    commit;
    DBMS_OUTPUT.put_line(i||'页抽取成功');
    
    end loop;
    
    END_TIME :=SYSDATE;
    
    --5.返回相关参数(插入多少行,用时多久)
    
    DBMS_OUTPUT.put_line(TOTAL_NUMBER||'行已插入');
    DBMS_OUTPUT.put_line('用时'||to_char(END_TIME-BEGIN_TIME));
    
    --6.异常处理(错误数据类型)
    
    EXCEPTION WHEN OTHERS THEN
      
      ROLLBACK;
      
    DBMS_OUTPUT.put_line('出现异常');
    DBMS_OUTPUT.put_line(DBMS_UTILITY.FORMAT_ERROR_STACK);
    
      
    end P_DATA_EXTRACT_0915;
    
    

    展开全文
  • 由于服务器内存资源有限,所以,无法使用Kettle一次性从源表导入目标表千万级别的数据,考虑采用分页导入的方式来进行数据传输,即: 根据实际情况设置一个每次处理的数据量,比如:5,000条,然后根据总的数据条数和...
  • 一、设置每次抽取条数 1.获取ES索引数据量 获取数据的方法与我之间写过的kettle从ES中抽数的文章中是一样的,只是本次抽数是为了获取索引的总条数,即total字段 1. 设置请求头参数 2. 获取数据(因为是之间对ES...
  • 添加表输入步骤,通过count函数查出源数据表的数据量 添加java代码步骤,将条数转换成页数 代码如下: public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { if ...
  • 由于服务器内存资源有限,所以,无法使用Kettle一次性从源表导入目标表千万级别的数据,考虑采用分页导入的方式来进行数据传输,即: 根据实际情况设置一个每次处理的数据量,比如:5,000条,然后根据总的数据条数...
  • kettle分页迁移数据

    千次阅读 2020-01-19 21:24:21
    kettle分页迁移数据介绍个人开发环境软件架构安装教程使用说明 介绍 基于kettle开发的ETL数据迁移功能,具有分页功能,理论可稳定迁移大表。 kettle做数据库数据迁移的时候,如果数据库中的表过大(几十G,甚至更大...
  • // 将分页的公用代码抽取出来 规定查询数据的方法名为fetchData,重新回显的方法名为reloadData,页面中统一调用 export default { data() { return { total: 0, // 总记录数 currentPage: 1, // 当前页码 layout...
  • kettle写的循环分页迁移数据的例子,迁移了36w数据,速度飞快,平均cpu使用只有19%。数据库表是运营商号段数据,网上有,比较大就不放上来了。
  • 今天测试出的一个bug,差点坑到了,大概场景就是在oracle数据库分页查询时,第一页的数据和第二页的数据重复率达到百分之70以上,开始以为是前端UI控件刷新问题,后面发现其实不是。简单记录下 SELECT * FROM ...
  • 1、 显示活动图片 问题: bos_management 可能和 bos_fore 不在同一台... 在 bos_domain 抽取常量类 修改 bos_domain 的 Promotion 实体类 2、 处理活动状态 1 显示 “进行中” , 2 显示 “已结束” ...
  • 分页技巧_抽取出公共的分页用的Service方法 TopicAction.java ForumAction.java 放在父类中DaoSupport.java DaoSupportImpl.java //@Transactional注解可以被继承,子类就不用写了 //@...
  • java使用多线程及分页查询数据量很大的数据 import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util...
  • 到这里,一个循环分页数据抽取导入的job就完成了,本文 只是作者在使用中的一次可行性尝试,如有不正确还请留言讨论。 参考链接:http://blog.csdn.net/butioy_org/article/details/54972836 ...
  • 分页技巧__实现第二个分页(主题列表中的分页)并抽取部分重复的代码 先写Action--->Service-->PageBean-->Jsp 在topicAction中把公共的分页用的参数的代码放到BaseAction里面 ForumAction.java @...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,648
精华内容 5,059
关键字:

分页抽取数据