lpad函数是Oracle数据库函数,lpad函数从左边对字符串使用指定的字符进行填充。
语法格式如下:
lpad( string, padded_length, [ pad_string ] )
string
准备被填充的字符串;
padded_length
填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;
pad_string
填充字符串,是个可选参数,这个字符串是要粘贴到string的左边,如果这个参数未写,lpad函数将会在string的左边粘贴空格。
同上,略
安装Eclipse插件、创建工程参考下方链接文档:
https://help.aliyun.com/document_detail/27981.html?spm=a2c4g.11186623.6.845.2211143aVPdWMl
在安装开发插件后,创建pad函数工程。
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);
}
}
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();
}
}
}