实现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
}
}