国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

hive的自定義函數(shù)以及自定義加密函數(shù)

這篇具有很好參考價(jià)值的文章主要介紹了hive的自定義函數(shù)以及自定義加密函數(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

hive對(duì)于敏感數(shù)據(jù)的加密還不夠完善,現(xiàn)在開發(fā)一個(gè)udf函數(shù),自己設(shè)置密鑰(hive的加密函數(shù)等級(jí)比較低,也沒(méi)有集成自己加密的密鑰函數(shù),所以自己開發(fā)一個(gè)),如果要加密一些數(shù)據(jù)則可以自己使用特定的密鑰進(jìn)行加密解密,這樣很好的方便數(shù)據(jù)的加密下面將實(shí)現(xiàn)過(guò)程如下:

1,寫一個(gè)Java類專門進(jìn)行加密算法,這個(gè)代碼網(wǎng)上很多都寫好了,可以直接抄一個(gè)過(guò)來(lái),代碼如下:

package hive_udf;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Scanner;

/*
 * AES對(duì)稱加密和解密
 */

public class AES {
public static final String ENCODE_RULES = "8DFC34B0B7C98EFA0A299A6C3FFFBD9D";
/*
     * 加密
     * 1.構(gòu)造密鑰生成器
     * 2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器
     * 3.產(chǎn)生密鑰
     * 4.創(chuàng)建和初始化密碼器
     * 5.內(nèi)容加密
     * 6.返回字符串
     */
    public static String AESEncode(String encodeRules,String content){
try {
//1.構(gòu)造密鑰生成器,指定為AES算法,不區(qū)分大小寫
            KeyGenerator keygen=KeyGenerator.getInstance("AES");
//2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器
            //生成一個(gè)128位的隨機(jī)源,根據(jù)傳入的字節(jié)數(shù)組
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(encodeRules.getBytes());
keygen.init(128, random);            //3.產(chǎn)生原始對(duì)稱密鑰
            SecretKey original_key=keygen.generateKey();
//4.獲得原始對(duì)稱密鑰的字節(jié)數(shù)組
            byte [] raw=original_key.getEncoded();
//5.根據(jù)字節(jié)數(shù)組生成AES密鑰
            SecretKey key=new SecretKeySpec(raw, "AES");
//6.根據(jù)指定算法AES自成密碼器
            Cipher cipher=Cipher.getInstance("AES");
//7.初始化密碼器,第一個(gè)參數(shù)為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個(gè)參數(shù)為使用的KEY
            cipher.init(Cipher.ENCRYPT_MODE, key);
//8.獲取加密內(nèi)容的字節(jié)數(shù)組(這里要設(shè)置為utf-8)不然內(nèi)容中如果有中文和英文混合中文就會(huì)解密為亂碼
            byte [] byte_encode=content.getBytes(StandardCharsets.UTF_8);
//9.根據(jù)密碼器的初始化方式--加密:將數(shù)據(jù)加密
            byte [] byte_AES=cipher.doFinal(byte_encode);
//10.將加密后的數(shù)據(jù)轉(zhuǎn)換為字符串
            //這里用Base64Encoder中會(huì)找不到包
            //解決辦法:
            //在項(xiàng)目的Build path中先移除JRE System Library,再添加庫(kù)JRE System Library,重新編譯后就一切正常了。
            //11.將字符串返回
            return new BASE64Encoder().encode(byte_AES);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
            e.printStackTrace();
        }

//如果有錯(cuò)就返加nulll
        return null;
    }
/*
     * 解密
     * 解密過(guò)程:
     * 1.同加密1-4步
     * 2.將加密后的字符串反紡成byte[]數(shù)組
     * 3.將加密內(nèi)容解密
     */
    public static String AESDncode(String encodeRules,String content){
try {
//1.構(gòu)造密鑰生成器,指定為AES算法,不區(qū)分大小寫
            KeyGenerator keygen=KeyGenerator.getInstance("AES");
//2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器
            //生成一個(gè)128位的隨機(jī)源,根據(jù)傳入的字節(jié)數(shù)組
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(encodeRules.getBytes());
keygen.init(128, random);
//3.產(chǎn)生原始對(duì)稱密鑰
            SecretKey original_key=keygen.generateKey();
//4.獲得原始對(duì)稱密鑰的字節(jié)數(shù)組
            byte [] raw=original_key.getEncoded();
//5.根據(jù)字節(jié)數(shù)組生成AES密鑰
            SecretKey key=new SecretKeySpec(raw, "AES");
//6.根據(jù)指定算法AES自成密碼器
            Cipher cipher=Cipher.getInstance("AES");
//7.初始化密碼器,第一個(gè)參數(shù)為加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二個(gè)參數(shù)為使用的KEY
            cipher.init(Cipher.DECRYPT_MODE, key);
//8.將加密并編碼后的內(nèi)容解碼成字節(jié)數(shù)組
            byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
/*
             * 解密
             */
            byte [] byte_decode=cipher.doFinal(byte_content);
return new String(byte_decode, StandardCharsets.UTF_8);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IOException | IllegalBlockSizeException | BadPaddingException e) {
            e.printStackTrace();
        }

//如果有錯(cuò)就返加nulll
        return null;
    }
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
/*
         * 加密
         */
        System.out.println("使用AES對(duì)稱加密,請(qǐng)輸入加密的規(guī)則");
String encodeRules=scanner.next();
System.out.println("請(qǐng)輸入要加密的內(nèi)容:");
String content = scanner.next();
System.out.println("根據(jù)輸入的規(guī)則"+encodeRules+"加密后的密文是:"+ AESEncode(encodeRules, content));

/*
         * 解密
         */
        System.out.println("使用AES對(duì)稱解密,請(qǐng)輸入加密的規(guī)則:(須與加密相同)");
        encodeRules=scanner.next();
System.out.println("請(qǐng)輸入要解密的內(nèi)容(密文):");
        content = scanner.next();
System.out.println("根據(jù)輸入的規(guī)則"+encodeRules+"解密后的明文是:"+ AESDncode(encodeRules, content));
    }

}

2,寫一個(gè)hive的udf類,集成hiveUdf,代碼實(shí)現(xiàn)如下:

package hive_udf;

import org.apache.hadoop.hive.ql.exec.UDF;
public class AesUdf extends UDF {
    //String password = "8DFC34B0B7C98EFA0A299A6C3FFFBD9D";

    public String evaluate ( String content,String password ,String type) throws Exception {
//        if (content == null) return null;
//
//        if(! type.equals("encode") && ! type.equals("decode")){
//            throw new Exception("Parmeter one is needed encode/decode");
//        }

        if(!content.equals(null) & type.equals("jiami")){
            //進(jìn)行加密
            return AES.AESEncode (password, content);
        }
        else{
            if(!content.equals(null) & type.equals("jiemi")){
                //進(jìn)行解密
                return AES.AESDncode(password, content);
            }
            return content;
        }
    }


    public static void main(String[] args) {

        try {
//            System.out.println("開始加密");
//            System.out.println("沒(méi)加密前原始數(shù)據(jù)為   test");
            System.out.println(new AesUdf().evaluate("test","1234abcd","jiami"));
//            System.out.println("加密后為"+new AesUdf().evaluate("test","1234abcd","jiami"));
//            String result  = new AesUdf().evaluate("test","1234abcd","jiami");
//            System.out.println("不加密也不解密,數(shù)據(jù)為"+new AesUdf().evaluate("test","1234abcd","jiami1"));
//            System.out.println("開始解密");
            System.out.println(new AesUdf().evaluate("result","1234abcd","jiemi"));
//            System.out.println("解密后的值為"+new AesUdf().evaluate(result,"1234abcd","jiemi"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上面代碼可以自己手動(dòng)設(shè)定密鑰,自己記住就行,后面可以直接加密解密,一般不同的數(shù)據(jù)都有自己的密鑰,不能共用一個(gè)密鑰

3,將代碼打成jar包,以及依賴關(guān)系如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>hive</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <!-- hive的udf依賴的包 -->
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>
    <!-- 打包類的依賴的jar的插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

4,將打成的jar包上傳到hdfs上,過(guò)程如下:

#一定記得,不然創(chuàng)建函數(shù)的時(shí)候會(huì)報(bào)警Class com.zmlearn.udf.AESUDF not found,因?yàn)闆](méi)有執(zhí)行權(quán)限

chmod 777 hive-1.0-SNAPSHOT.jar

hadoop fs -mkdir /hive_UDF

hadoop fs -put /root/data/hive-1.0-SNAPSHOT.jar /hive_UDF

5.進(jìn)入hive客戶端,創(chuàng)建UDF函數(shù)。

create function test.AES_UDF as 'hive_udf.AesUdf' using jar 'hdfs://namenode:9000/hive_UDF/hive-1.0-SNAPSHOT.jar';

加上庫(kù)名是為了在哪個(gè)庫(kù)下面生效,如果不加的話默認(rèn)是default庫(kù)

6.使用創(chuàng)建的UDF函數(shù):

hive 加密函數(shù),hive,hadoop,數(shù)據(jù)倉(cāng)庫(kù),安全,java,Powered by 金山文檔

select AES_UDF(a.name,'1234abcd','jiami') as jiam,AES_UDF(AES_UDF(a.name,'1234abcd','jiami'),'1234abcd','jiemi') as jiem,name,id from student a;

以上就是hive實(shí)現(xiàn)加密解密的udf函數(shù)的設(shè)計(jì),目前我使用沒(méi)問(wèn)題,加密解密數(shù)據(jù)都正常,如果大家使用我上面的函數(shù)有問(wèn)題,歡迎大家來(lái)找我私聊文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-712465.html

到了這里,關(guān)于hive的自定義函數(shù)以及自定義加密函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 漫談數(shù)據(jù)倉(cāng)庫(kù)之拉鏈表(原理、設(shè)計(jì)以及在Hive中的實(shí)現(xiàn)

    漫談數(shù)據(jù)倉(cāng)庫(kù)之拉鏈表(原理、設(shè)計(jì)以及在Hive中的實(shí)現(xiàn)

    本文將會(huì)談一談在數(shù)據(jù)倉(cāng)庫(kù)中拉鏈表相關(guān)的內(nèi)容,包括它的原理、設(shè)計(jì)、以及在我們大數(shù)據(jù)場(chǎng)景下的實(shí)現(xiàn)方式。 全文由下面幾個(gè)部分組成: 先分享一下拉鏈表的用途、什么是拉鏈表。 通過(guò)一些小的使用場(chǎng)景來(lái)對(duì)拉鏈表做近一步的闡釋,以及拉鏈表和常用的切片表的區(qū)別。

    2024年04月12日
    瀏覽(25)
  • python的自定義函數(shù)的用法和實(shí)例

    python的自定義函數(shù)的用法和實(shí)例

    目錄 1.自定義函數(shù)的語(yǔ)法和用法 (1)引入 (2)語(yǔ)法 (3)用法:用于自定義目標(biāo)函數(shù)語(yǔ)法。 (4)調(diào)用函數(shù) ①語(yǔ)法 ②解釋 2.實(shí)例 (1)簡(jiǎn)單的用法 (2)與input函數(shù)、while語(yǔ)句結(jié)合使用 python語(yǔ)言調(diào)用的求和sum()、replace等函數(shù)是已經(jīng)定義好的函數(shù),而我們想要調(diào)用自己想要的函

    2024年02月08日
    瀏覽(17)
  • Python 程序設(shè)計(jì)入門(023)—— Python 的自定義函數(shù)

    在 Python 中,函數(shù)的應(yīng)用非常廣泛。比如:input()、print()、str()、range()、len() 等,這些稱為 Python 的內(nèi)置函數(shù),可以直接使用。Python 支持自定義函數(shù),即將一段有規(guī)律的、可重復(fù)使用的代碼定義為函數(shù),達(dá)到一次編寫,多次使用的目的。 自定義函數(shù)使用 def 實(shí)現(xiàn),語(yǔ)法格

    2024年02月12日
    瀏覽(21)
  • 【Spring Cloud】基于 Feign 實(shí)現(xiàn)遠(yuǎn)程調(diào)用,深入探索 Feign 的自定義配置、性能優(yōu)化以及最佳實(shí)踐方案

    【Spring Cloud】基于 Feign 實(shí)現(xiàn)遠(yuǎn)程調(diào)用,深入探索 Feign 的自定義配置、性能優(yōu)化以及最佳實(shí)踐方案

    在微服務(wù)架構(gòu)中,服務(wù)之間的通信是至關(guān)重要的,而遠(yuǎn)程調(diào)用則成為實(shí)現(xiàn)這種通信的一種常見方式。在 Java 中,使用 RestTemplate 是一種傳統(tǒng)的遠(yuǎn)程調(diào)用方式,但它存在一些問(wèn)題,如代碼可讀性差、編程體驗(yàn)不一致以及參數(shù)復(fù)雜URL難以維護(hù)等。 在本文中,我們將探討如何通過(guò)使

    2024年02月04日
    瀏覽(19)
  • 如何使用torch.nn.utils.prune稀疏神經(jīng)網(wǎng)絡(luò),以及如何擴(kuò)展它以實(shí)現(xiàn)自己的自定義剪裁技術(shù)

    最新的深度學(xué)習(xí)技術(shù)依賴于難以部署的過(guò)度參數(shù)化模型。 相反,已知生物神經(jīng)網(wǎng)絡(luò)使用有效的稀疏連通性。 為了減少內(nèi)存,電池和硬件消耗,同時(shí)又不犧牲精度,在設(shè)備上部署輕量級(jí)模型并通過(guò)私有設(shè)備上計(jì)算來(lái)確保私密性,確定通過(guò)減少模型中的參數(shù)數(shù)量來(lái)壓縮模型的最

    2024年02月12日
    瀏覽(20)
  • 基于 YOLOv8 的自定義數(shù)據(jù)集訓(xùn)練

    基于 YOLOv8 的自定義數(shù)據(jù)集訓(xùn)練

    圖1.1:YOLOv8初始測(cè)試 YOLOv8??于 2023年1月10日由Ultralytics發(fā)布。它在計(jì)算機(jī)視覺(jué)方面提供了進(jìn)展,帶來(lái)了對(duì)我們感知、分析和理解視覺(jué)世界的巨大創(chuàng)新。它將為各個(gè)領(lǐng)域帶來(lái)前所未有的可能性。 在速度、準(zhǔn)確性和架構(gòu)方面進(jìn)行了相當(dāng)大的改進(jìn)。它是從頭開始實(shí)現(xiàn)的,沒(méi)有使用任

    2024年02月11日
    瀏覽(25)
  • 使用ETLCloud強(qiáng)大的自定義規(guī)則實(shí)現(xiàn)自定義數(shù)據(jù)處理算法

    使用ETLCloud強(qiáng)大的自定義規(guī)則實(shí)現(xiàn)自定義數(shù)據(jù)處理算法

    實(shí)時(shí)數(shù)據(jù)處理規(guī)則有什么作用 ? 在大數(shù)據(jù)中的實(shí)時(shí)數(shù)據(jù)采集、ETL批量數(shù)據(jù)傳輸過(guò)程中很多數(shù)據(jù)處理過(guò)程以及數(shù)據(jù)質(zhì)量都希望實(shí)時(shí)進(jìn)行處理和檢測(cè)并把不符合要求的臟數(shù)據(jù)過(guò)濾掉或者進(jìn)行實(shí)時(shí)的數(shù)據(jù)質(zhì)量告警等。 在數(shù)據(jù)倉(cāng)庫(kù)建設(shè)過(guò)程中,每家企業(yè)的數(shù)據(jù)處理過(guò)程中肯定會(huì)有一

    2024年02月08日
    瀏覽(22)
  • Hive 自定義函數(shù)

    Hive 自定義函數(shù)

    大家好,我是數(shù)據(jù)開發(fā)者,非常感謝大家最近的關(guān)注,你們的關(guān)注是我持續(xù)輸出的動(dòng)力,讓我們共同提高。 大數(shù)據(jù)平臺(tái)下的數(shù)據(jù)倉(cāng)庫(kù)搭建過(guò)程中存在許多個(gè)性化的業(yè)務(wù)需求,或者說(shuō)是系統(tǒng)需求,無(wú)法在 Hive 提供的內(nèi)置函數(shù)中找到解決辦法,為了解決這個(gè)問(wèn)題,我們可以使用

    2023年04月09日
    瀏覽(20)
  • Hive自定義函數(shù)

    Hive自定義函數(shù)

    ? ? 本文章主要分享單行函數(shù)UDF(一進(jìn)一出) 現(xiàn)在前面大體總結(jié),后邊文章詳細(xì)介紹 自定義函數(shù)分為臨時(shí)函數(shù)與永久函數(shù) 需要?jiǎng)?chuàng)建Java項(xiàng)目,導(dǎo)入hive依賴 創(chuàng)建類繼承? GenericUDF(自定義函數(shù)的抽象類) (實(shí)現(xiàn)函數(shù)) 打成jar包,傳到服務(wù)器上 將jar包添加到hive的class path上臨時(shí)

    2024年02月16日
    瀏覽(13)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】3 知行合一,線性查找的自定義類測(cè)試

    【算法與數(shù)據(jù)結(jié)構(gòu)】3 知行合一,線性查找的自定義類測(cè)試

    歡迎來(lái)到愛書不愛輸?shù)某绦蛟车牟┛? 本博客致力于知識(shí)分享,與更多的人進(jìn)行學(xué)習(xí)交流 本文收錄于算法與數(shù)據(jù)結(jié)構(gòu)體系專欄, 本專欄 對(duì)于0基礎(chǔ)者極為友好,歡迎與我一起完成算法與數(shù)據(jù)結(jié)構(gòu)的從0到1的跨越 ??首篇詳細(xì)講述線性查找法并且對(duì)其進(jìn)行了 初步的優(yōu)化 :??傳送門

    2023年04月27日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包