etl中的数据转换

该博客介绍了在ETL过程中进行数据转换的实现方法,包括数值乘法、除法、decode函数、从JSON获取值、日期格式转换、字符串分割以及追加特定字符串等功能。通过示例代码展示了如何使用这些转换函数来操作数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现etl中的数据转换

package com.yst.core.parser

import java.util.Map
import java.util.HashMap
import scala.util.parsing.json._
import java.text.SimpleDateFormat
import java.util.Date
import java.util.TimeZone
import java.text.ParseException


/**
 * 转换函数
 */
class FormatFunParser(map:Map[String,Object]) extends FunParser(map){ 
  
  /**
   * 数值乘
   * 
   * targetFields_multi('a,b',100)={
   *   val key1 =a;
   *   val value1 = map.get(a)
   *   val mvalue1 = value*100
   *   
   *   val key2 =a;
   *   val value2 = map.get(a)
   *   val mvalue2 = value2*100
   *   
   *   val retmap= new HashMap()
   *   retmap.put(key1,mvalue1)
   *   retmap.put(key2,mvalue2)
   * }
   * 
   */
  def targetFields_multi:Parser[Map[String,Object]]="targetFields_multi("~>jtxt~","~wholeNumber<~")"^^{
    case pkey~comma~num=>{
      val retmap= new HashMap[String,Object]
      val numInteger = Integer.valueOf(num)
      var ret:Object=null
      pkey.toString().split(",").foreach(f=>{
        val value = map.get(f)
        var valueInteger =Integer.valueOf("0")
        if(value!=null){
          valueInteger=  Integer.valueOf(value.toString())*numInteger
          retmap.put(f,valueInteger)}
        })
      retmap 
    }
  }
  
 /**
   * 数值除
   * 
   * targetFields_multi('a,b',100)={
   *   val key1 =a;
   *   val value1 = map.get(a)
   *   val mvalue1 = value/100
   *   
   *   val key2 =a;
   *   val value2 = map.get(a)
   *   val mvalue2 = value2/100
   *   
   *   val retmap= new HashMap()
   *   retmap.put(key1,mvalue1)
   *   retmap.put(key2,mvalue2)
   * }
   * 
   */
  def targetFields_division:Parser[Map[String,Object]]="targetFields_division("~>jtxt~","~wholeNumber<~")"^^{
    case pkey~comma~num=>{
      val retmap= new HashMap[String,Object]
      val numInteger = java.lang.Float.valueOf(num)
      var ret:Object=null
      pkey.toString().split(",").foreach(f=>{
        val value = map.get(f)
        var valueInteger =  java.lang.Float.valueOf("0")
        if(value!=null){
          valueInteger=  java.lang.Float.valueOf(value.toString()) /numInteger

          retmap.put(f,valueInteger)}
        })
      retmap 
    }
  }
  
  /**
   * decode函数
   * decode(con,key1,value1,key2,value2,default)={
   *     if(con==key1){
   *         return value1;
   *   }else if(con==key2){
   *    return value2;
   *   }else {
   *    return default
   *   }
   * }
   */
  def decode:Parser[Object] = "decode("~>repsep(cparam|param|jStr,",")<~")"^^{
    case s=>{
      val col = s.head
      val default = if(s.last==null |s.last.toString().endsWith("null")){null}else{s.last.toString()}
      val conditions= s.init.tail
     
      var flag = true
      var ret=default
      for(i<-0 to conditions.size-1 if flag){
          if(i%2==0){
            val con = conditions(i).toString()
            val value = conditions(i+1).toString()
            if(col.toString().equals(  con  ) ){
                ret=value
               flag=false
            }
            
          }
      }
       
      
      //返回
     ret
      
    }
  }
  /**
   * 获取json中某个key值
   * json("'a':33,'b':'test'",b)=test
   */
  def json:Parser[Object] = "json("~>param~","~jStr<~")"^^{
    case param~comma~jsonkey=>{
      
      if(param!=null){
        val jsonS = JSON.parseFull(param.toString())
        val jsonmap = jsonS.get.asInstanceOf[scala.collection.immutable.Map[String,Any]]
        jsonmap(jsonkey.toString()).toString()
      }else{
        null
      }
    }
    
  }
  
  /**
   * 日期格式转换
   * dataFormat('20190428','yyyymmdd')
   */
  def dateFormat:Parser[Object] = "dateFormat("~>param~","~jtxt<~")"^^{
    case param~comma~pattrean=>{   
      if(param!=null){
          val sdf = new SimpleDateFormat(pattrean.toString());
                sdf.parse(param.toString());
      }    else{
          null
      }        
    }
     
  }
  
  /**
   * split分割函数
   * ${A}="x,y,z"
   * split(${A},',',1)=y
   */
  def split:Parser[Object] = "split("~>param~","~jtxt~","~jStr<~")"^^{
    case param~comma~splits~commb~num=>{
      var ret:Object= null
      if(param!=null){
            val pstr = param.toString()
            val pstrs=  pstr.split(splits.toString())
            val numb = Integer.valueOf(num.toString())
            
            if(pstrs.size>=numb+1){
             ret= pstrs(numb)
            }
      }
      ret
    }
    
  }
  
  /**
   * 追加
   * ${A}=aa
   * atomi 为6位递增序列不足补零  如:000001
   * append(${A},atomi)=aa000001
   */
  def append:Parser[Object] = "append("~>param~","~jStr<~")"^^{
   
    case param~comma~pattern=>{
       val patternStr = pattern.toString()
       var appends:String = null
       if(patternStr.equals("atomi")){
         appends =   String.format("%06d",AtomicTool.get)
       }else{
         appends = patternStr
       }
       if(param!=null){
          param.toString()+appends
       }else{
         null
       }
    }
  }
  
  def model: Parser[Object] = targetFields_multi|targetFields_division|substrFun|decode|json|append|split|dateFormat^^{
      s=>s
  }
  
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值