zoukankan      html  css  js  c++  java
  • six month dormancy test

    source data:

    accountleg    year_month    amount
    acc1A    2010-01    100
    acc1A    2010-02    100
    acc1A    2010-03    100
    acc1A    2010-04    100
    acc1A    2010-06    100
    acc1A    2010-07    100
    acc1A    2010-08    100
    acc1A    2010-09    100
    acc1A    2010-10    100
    acc1A    2010-11    100
    acc1A    2011-06    100
    acc1A    2011-07    100
    acc1A    2011-08    100
    acc1A    2011-09    100
    acc1A    2011-10    100
    acc1A    2011-11    100
    acc1A    2011-12    100
    acc1A    2012-01    100
    acc1A    2012-07    100

     
    create table sixdormancy (accountleg string,year_month string,amount double) row format delimited fields terminated by '	';
    load data local inpath '/mnt/data/sixdormancy.txt' into table sixdormancy;
    --get the last row year_month
    drop table sixdormancy_lastmonth;
    create table sixdormancy_lastmonth as 
    select 
    *,
    lag(year_month) over(partition by accountleg order by year_month) as  lastmonth
    from sixdormancy;
    
    create table sixdormancy_monthdiff as 
    select *,
    (year(concat(year_month,'-01')) - year(concat(lastmonth,'-01')))*12
    +month(concat(year_month,'-01'))-
    month(concat(lastmonth,'-01')) as monthdiff
    from sixdormancy_lastmonth;
    
    select accountleg from sixdormancy_monthdiff where monthdiff>5 group by accountleg;
    
    if 0.10 not support lag function, we can write one udf to do this, and then we can combine
    the calculation and filter and the udf.
    package myudf;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    
    public class dormancy extends UDF {
    
        String accountleg = "";
        String predate = "";
        boolean isDormancy = false;
    
        public boolean evaluate(String _accountleg, String _date) {
        isDormancy=false;
    if (accountleg.equalsIgnoreCase(_accountleg)) { isDormancy = hasSixMonthsGap(predate, _date); } accountleg = _accountleg; predate = _date; return isDormancy; } boolean hasSixMonthsGap(String _sd, String _bd) { // issue yyyy-MM int year1 = Integer.parseInt(_bd.substring(1, 4)); int year2 = Integer.parseInt(_sd.substring(1, 4)); int month1 = Integer.parseInt(_bd.substring(5, 7)); int month2 = Integer.parseInt(_sd.substring(5, 7)); int cp = (year1 - year2) * 12 + (month1 - month2) + 1; if (cp > 7) // has dormancy return true; else return false; } public static void main(String[] args) { dormancy test = new dormancy(); // read data from source String filepath = "/mnt/data/sixdormancy.txt"; try { BufferedReader br = new BufferedReader(new FileReader(filepath)); String line; line = br.readLine(); String[] items = null; while (line != null) { // handle this line data items = line.split(" "); System.out.print(line); System.out.print(" "); System.out.println(test.evaluate(items[0], items[1])); line = br.readLine(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } } }
    add jar /home/hadoop/workspace/myudf/bin/myudf.jar;
    create temporary function dormancy as "myudf.dormancy";
    select *,dormancy(accountleg,year_month) from 
    (select * from sixdormancy distribute by accountleg sort by accountleg, year_month) a;

    image

    Looking for a job working at Home about MSBI
  • 相关阅读:
    ASP.net 网站项目:Fckeditor使用StepByStep
    SQL2005触发器写法
    Android 中 PopupWindow使用
    storyboard学习笔记-1
    判断两矩形是否相交
    CListCtrl 使用
    字符串和数字之间的转换(Unicode)
    【转】全特化/偏特化
    判断点是否在多边形内——射线法
    c++强制转化
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/4395380.html
Copyright © 2011-2022 走看看