Java中的配置单元Udf(加密和解密)

Java中的配置单元Udf(加密和解密),java,hadoop,encryption,hive,Java,Hadoop,Encryption,Hive,实际上,我已经用Java编写了一个用于加密和解密的HiveUDF。 但它有一些小错误。我找不到它,请有人纠正并建议我做一些修改 问题: 加密代码: 解密代码: 我怀疑您的自定义项会评估返回类型文本。将返回类型从文本更改为字符串,因为配置单元支持以下字符串类型: STRING VARCHAR (Note: Only available starting with Hive 0.12.0) CHAR (Note: Only available starting with Hive 0.13.0)

实际上,我已经用Java编写了一个用于加密和解密的HiveUDF。 但它有一些小错误。我找不到它,请有人纠正并建议我做一些修改

问题: 加密代码: 解密代码:
我怀疑您的自定义项会评估返回类型文本。将返回类型从文本更改为字符串,因为配置单元支持以下字符串类型:

STRING
VARCHAR (Note: Only available starting with Hive 0.12.0)
CHAR (Note: Only available starting with Hive 0.13.0)
请检查配置单元数据类型
原因与蜂巢无关


加密字符串由CRLFs分隔,因此您应该删除加密方法末尾的
\r\n
返回新文本(EncText.toString().replaceAll(“\r\n”,”)

谢谢@Will Du,你的解决方案对我很有效

我已经实现了加密代码并遇到了类似的问题。 下面对
Encrypt
方法的返回行进行了更改

之前:

return output;
之后:

return output.replaceAll("\r|\n", "");

如果回答了你的问题,请考虑接受他的回答。
package Encrypt;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
import org.apache.commons.codec.binary.Base64;
import org.apache.hadoop.hive.ql.exec.FunctionTask;
import java.security.MessageDigest;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public final class Dec1 extends UDF {

public Text evaluate(final Text s) {
  if (s == null) {
    return null;
   }
  byte[] sharedvector = {
   0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
   };

String RawText = "";
byte[] keyArray = new byte[24];
byte[] temporaryKey;
String key = "developersnotedotcom";
byte[] toEncryptArray = null;

try
  {

    MessageDigest m = MessageDigest.getInstance("MD5");
        temporaryKey = m.digest(key.getBytes("UTF-8"));           

        if(temporaryKey.length < 24) // DESede require 24 byte length key
        {
            int index = 0;
            for(int i=temporaryKey.length;i< 24;i++)
            {                  
                keyArray[i] =  temporaryKey[index];
            }
        }

        Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyArray, "DESede"), new IvParameterSpec(sharedvector));
        byte[] decrypted = c.doFinal(Base64.decodeBase64(s.toString()));    
        RawText = new String(decrypted, "UTF-8"); 
   }
   catch(Exception NoEx)
    {
    //JOptionPane.showMessageDialog(null, NoEx);
     System.out.println(NoEx + "This is Udf error");
     System.exit(1);
    }

   return new Text(RawText.toString());        
}

}
Decrypted I/p Ex:     1      fdfsvansjw=
                      NULL   NULL
                      2      adf4vandjw=
                      NULL   NULL

Decrypted o/p Ex:    1      AAA
                     /n     /n
                     2      BBB
                     /n     /n

There should'nt be any Null's or /n when encryption and decryption.
Tried to find out the bug. But can't find out.
Please Help me.

Thanks
STRING
VARCHAR (Note: Only available starting with Hive 0.12.0)
CHAR (Note: Only available starting with Hive 0.13.0)
return output;
return output.replaceAll("\r|\n", "");