使用阿里云ODPS UDF实现ORACLE lpad函数与rpad函数

lpad函数

lpad函数是Oracle数据库函数,lpad函数从左边对字符串使用指定的字符进行填充。

语法格式如下:
lpad( string, padded_length, [ pad_string ] )
string
准备被填充的字符串;
padded_length
填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;
pad_string
填充字符串,是个可选参数,这个字符串是要粘贴到string的左边,如果这个参数未写,lpad函数将会在string的左边粘贴空格。

rpad函数

同上,略

Eclipse 开发UDP程序

安装Eclipse插件、创建工程参考下方链接文档:
https://help.aliyun.com/document_detail/27981.html?spm=a2c4g.11186623.6.845.2211143aVPdWMl

创建工程

在安装开发插件后,创建pad函数工程。

  1. 创建ODPS项目
    使用阿里云ODPS UDF实现ORACLE lpad函数与rpad函数_第1张图片
    使用阿里云ODPS UDF实现ORACLE lpad函数与rpad函数_第2张图片
    2.编写lpad与rpad函数Java程序
    使用阿里云ODPS UDF实现ORACLE lpad函数与rpad函数_第3张图片
实现lpad函数
package pad;

import com.aliyun.odps.udf.UDF;

public class LeftPad extends UDF {
    
	private static final String BLANK = " ";
	 
	 public String evaluate(String str,Long paddedLength){
	    	StringBuffer targetString = new StringBuffer();
			int strLength = str.length();
			
			if(strLength == 0){
				return "";
			}
			
			//paddedLength小于0,补空格输出
			if(paddedLength <= 0){
				for (int i = 0; i < Math.abs(paddedLength); i++) {
					targetString.append(BLANK);
				}
				return targetString.toString();
			}
			
			
			//paddedLength小于原字符长度,直接截取字符串
			if(paddedLength < strLength){
				return str.substring(0, (int)(long)paddedLength);
			}else if(paddedLength == strLength){
				return str;
			}else{
				for (int i = 0; i < paddedLength - strLength; i++) {
					targetString.append(BLANK);
				}
				targetString.append(str);
				return targetString.toString();
			}
		}

	
	public String evaluate(String str,Long paddedLength, String padString) {
		StringBuffer targetString = new StringBuffer();
		int strLength = str.length();
		int padLength = padString.length();
		
		if(strLength == 0 || padLength == 0){
			return "";
		}
		
		//paddedLength小于0,补空格输出
		if(paddedLength <= 0){
			for (int i = 0; i < Math.abs(paddedLength); i++) {
				targetString.append(BLANK);
			}
			return targetString.toString();
		}
		
		//paddedLength小于原字符长度,直接截取字符串
		if(paddedLength < strLength){
			return str.substring(0, (int)(long)paddedLength);
		}else if(paddedLength == strLength){
			return str;
		}else{
			if(paddedLength >= strLength + padLength){
				for (int i = 0; i < (paddedLength - strLength) / padLength; i++) {
					targetString.append(padString);
				}
			}
			targetString.append(padString.substring(0,((int)(long)paddedLength - strLength) % padLength));
			targetString.append(str);
			return targetString.toString();
		}
	}
	
   
}

程序的类需要继承UDF类,并实现evaluate 方法。
evaluate方法可以以重载的方式实现多个功能,例如上方两个方法:String evaluate(String str,Long paddedLength) 与 String evaluate(String str,Long paddedLength,String padString)

注意: evaluate 参数列表的类型odps与Java类型对照
此处有坑,基本的数据类型需要用包装类型,目前应该只支持下列六种类型,与数据库表的数据类型相对应。

odps Java
STRING String
BIGINT Long (需要使用包装类型)
DOUBLE Double
BOOLEAN Boolean
DATETIME Date
DECIMAL BigDecimal
package com.aliyun.odps.udf;

import com.aliyun.odps.OdpsDeprecatedLogger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.runtime.internal.AroundClosure;
import org.aspectj.runtime.reflect.Factory;

public enum OdpsType
{
  private OdpsType() {}
  
  static
  {
    STRING = new OdpsType("STRING", 0);
    BIGINT = new OdpsType("BIGINT", 1);
    DOUBLE = new OdpsType("DOUBLE", 2);
    BOOLEAN = new OdpsType("BOOLEAN", 3);
    DATETIME = new OdpsType("DATETIME", 4);
    DECIMAL = new OdpsType("DECIMAL", 5);
  }
}

rpad函数

package pad;

import com.aliyun.odps.udf.UDF;

public class RightPad extends UDF {
    
	 private static final String BLANK = " ";
	
	 public String evaluate(String str,Long paddedLength){
	    	StringBuffer targetString = new StringBuffer();
			int strLength = str.length();
			if(strLength == 0){
				return "";
			}
			//paddedLength小于0,补空格输出
			if(paddedLength <= 0){
				for (int i = 0; i < Math.abs(paddedLength); i++) {
					targetString.append(BLANK);
				}
				return targetString.toString();
			}
			//paddedLength小于原字符长度,直接截取字符串
			if(paddedLength < strLength){
				return str.substring(0, (int)(long)paddedLength);
			}else if(paddedLength == strLength){
				return str;
			}else{
				targetString.append(str);
				for (int i = 0; i < paddedLength - strLength; i++) {
					targetString.append(BLANK);
				}
				return targetString.toString();
			}
		}
	
	public String evaluate(String str,Long paddedLength, String padString) {
		StringBuffer targetString = new StringBuffer();
		int strLength = str.length();
		int padLength = padString.length();
		
		if(strLength == 0 || padLength == 0){
			return "";
		}
		
		//paddedLength小于0,补空格输出
		if(paddedLength <= 0){
			for (int i = 0; i < Math.abs(paddedLength); i++) {
				targetString.append(BLANK);
			}
			return targetString.toString();
		}
		
		//paddedLength小于原字符长度,直接截取字符串
		if(paddedLength < strLength){
			return str.substring(0, (int)(long)paddedLength);
		}else if(paddedLength == strLength){
			return str;
		}else{
			targetString.append(str);
			if(paddedLength >= strLength + padLength){
				for (int i = 0; i < (paddedLength - strLength) / padLength; i++) {
					targetString.append(padString);
				}
			}
			targetString.append(padString.substring(0,((int)(long)paddedLength - strLength) % padLength));
			return targetString.toString();
		}
	}
	
   

}

打包上传,建立函数

1.将jar包上传到资源管理
使用阿里云ODPS UDF实现ORACLE lpad函数与rpad函数_第4张图片
2. 建立函数
使用阿里云ODPS UDF实现ORACLE lpad函数与rpad函数_第5张图片
3.使用
使用阿里云ODPS UDF实现ORACLE lpad函数与rpad函数_第6张图片

你可能感兴趣的:(Java-Web)