package UDF_test;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class ID15to18 extends UDF {
public Text evaluate(final Text str) {
if(str.getLength()==15 && str.toString().matches("^[0-9]*$")) {
// 转为String类型
String id = str.toString();
// 得到17位数字
String newId = id.substring(0,6) + "19"+ id.substring(6,id.length());
// 系数因子
int[] factorArr = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// 校验最后一位
String[] checkArr = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
//计算最后一位
int sum = 0;
for (int i=0;i<17;i++) {
sum += (newId.toCharArray()[i] - '0') * factorArr[i];
}
// 返回18位身份证号
return new Text(newId + checkArr[sum % 11]);
}else {
return str;
}
}
}
FUNCTION ID_NO_15TO18(ID_NO VARCHAR2) RETURN VARCHAR2 IS
TYPE TIARRAY IS TABLE OF INTEGER;
TYPE TCARRAY IS TABLE OF CHAR(1);
RESULTS VARCHAR2(18);
W TIARRAY; --数字数组
A TCARRAY; --字符数组
S INTEGER;
BEGIN
IF ID_NO IS NULL THEN
RETURN '';
END IF;
IF LENGTH(ID_NO) <> 15 THEN
RETURN ID_NO;
END IF;
W := TIARRAY(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
A := TCARRAY('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
RESULTS := SUBSTR(ID_NO, 1, 6) || '19' || SUBSTR(ID_NO, 7, 9);
S := 0;
BEGIN
FOR I IN 1 .. 17 LOOP
S := S + TO_NUMBER(SUBSTR(RESULTS, I, 1)) * W(I);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
RETURN '';
END;
S := S MOD 11;
RESULTS := RESULTS || A(S + 1);
RETURN(RESULTS);
END ID_NO_15TO18;