hive 中自定義 base64 加密 解密 UDF 函數

一、maven依賴 

<dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>1.2.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>

                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.neu.hive.UDF.ToUpperCaseUDF</mainClass>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

 二、base64 解密代碼

public class Decode extends UDF {

    private static final Logger log = Logger.getLogger(Decode.class);

    private static final String charset = "utf-8";

    public String evaluate(String param){
        if (param == null) {
            return null;
        }
        byte[] bytes = Base64.decodeBase64(param);
        try {
            String res = new String(bytes,charset);
            return res;
        } catch (UnsupportedEncodingException e) {
            log.error(String.format("字符串:{}解密失敗",param),e);
        }
        return null;
    }

三、base64加密代碼

public class Encode extends UDF {

    private static final Logger log = Logger.getLogger(Encode.class);

    private static final String charset = "utf-8";


    public String evaluate(String param){
        if (param == null){
            return null;
        }
        try {
            return new String(Base64.encodeBase64(param.getBytes(charset)), charset);
        } catch (UnsupportedEncodingException e) {
            log.error(String.format("字符串:%s加密異常",param),e);
        }
        return null;
    }

 注:如上代碼所示:

   1、自定義hive 的UDF函數需要繼承UDF

   2、自定義方法需要實現evaluate方法,否則不能生效,evaluate方法可以重載

四、打包編譯上傳服務器任意目錄,如下圖所示

五、進入hive操作界面

六、將上傳的jar添加至hive的classpath中,如下指令

指令:add jar /opt/hive/udf/encode-and-decode.jar;

注意:後面的路徑是我放打好的udf  的jar包的路徑;

七、查看jar包是否存在

指令:list jar;

如圖:

八、創建我們的udf函數

指令:create temporary function encode as 'com.zdww.dsj.udf.Encode';

注:以上指令是:create temporary function + 自定義UDF函數名稱 + as + 編寫這個Encode類的路徑

上面截圖所示類的路徑;

九、查看是否存在我們自定義UDF函數

指令:show functions;

十、使用自定義UDF函數

例如:

select encode(name) from dw.mps_event;

注:encode() 中encode是我們自定義函數名稱,()裏面傳入我們需要加密或者解密的參數

結果如圖:

刪除臨時UDF函數指令:
drop temporary function encode;

注:encode 是UDF函數名稱;

 十一、特別注意:
以上創建的UDF函數只是臨時的UDF函數,只會存在於此時所開的黑窗口界面使用,如果令開一個hive操作界面,我們定義的UDF函數就不能使用了;所以如下 給出創建全局UDF函數

十二、創建全局(永久)UDF函數

1、在hdfs上創建一個/lib目錄

指令:hadoop fs -mkdir /lib

2、將我們之前存放在服務器中的jar上傳到我們創建的lib目錄下

指令:hadoop fs -put /opt/hive/udf/encode-and-decode.jar /lib

如圖:

3、hive操作界面創建永久函數

指令:

create function test_encode as 'com.zdww.dsj.udf.Encode' using jar 'hdfs://zdww-dsj/lib/encode-and-decode.jar';

注:create function + 自定義函數名稱 + as + 編寫這個Encode類的路徑 + using jar + hdfs上的jar所在路徑;

4、如上全局的UDF函數即創建好 

注:可以在hive的元數據庫中查看FUNCS表,會有自定義全局UDF函數的信息;

5、刪除UDF:

指令:drop function test_encode;

 

發佈了20 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章