JANA基础 hive udf 编写以及JDBC连接测试

一、UDF(User Defined Function:用户定义函数)

Hive本身内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,同时也支持用户扩展UDF 函数来完成内置函数无法实现的操作。 官网API

1.1、继承UDF函数

继承UDF类,实现简单,只需要重写evaluate方法(该方法必须返回String类型)读取和返回基本类型,但是在hive3.0版本中,已不建议使用该类,推荐使用 GenericUDF

1.1.1、pom.xml 引入hive执行包

<dependency>
	<groupId>org.apache.hive</groupId>
	<artifactId>hive-exec</artifactId>
	<version>3.1.0</version>
</dependency>

1.1.2、MaskUDF 实现掩码函数

3.0开始已不建议使用:

源码:

package com.renxiaozhao.udf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.metadata.HiveException;

/**
 * 掩码函数.
 * @author rxz 20220808
 *
 */
@SuppressWarnings("deprecation")
public class MaskUDF extends UDF {
 
    private static final int MASK_LEFT = 0;//掩码从左至右标识
    private static final int MASK_RIGHT = -1;//掩码从右至左标识
    
    /**
     * 掩码处理.
     * @param input 掩码输入参数
     * @param startIndex 掩码从左至右标识:0-掩码从左至右;-1-掩码从右至左;其他则按位截取,比如2-从第三位开始截取
     * @param subIndex 掩码位数
     * @return
     * @throws HiveException
     */
    public String evaluate(String input,Integer startIndex,Integer subIndex) throws HiveException {
 
        //掩码处理
        String append = "";
        if (startIndex == MASK_LEFT || startIndex == MASK_RIGHT) {
 
            for (int i = 0;i < subIndex;i++) {
 
                append += "*";
            }
        } else {
 
            for (int i = 0;i < (subIndex - startIndex);i++) {
 
                append += "*";
            }
        }
        if (startIndex == MASK_LEFT) {
 
            return append + input.substring(subIndex);
        } else if (startIndex == MASK_RIGHT) {
 
            return input.substring(0, input.length() - subIndex) + append;
        } else {
 
            return input.substring(0,startIndex) + append + input.substring(subIndex);
        }
    }
    
    //测试
    public static void main(String[] args) {
 
        String input = "18866866888";
        String append = "";
        for (int i = 0;i < (6 - 4);i++) {
 
            append += "*";
        }
        System.out.println(input.substring(0,4) + append + input.substring(6));
    }
}

1.1.3、打包放到hive环境

hive-env.sh配置jar包路径

将jar包放到 HIVE_AUX_JARS_PATH 对应的目录下(不再需要单独执行add jar …),重启hive

export HIVE_AUX_JARS_PATH=/root/collect

1.1.4、创建临时函数测试

create temporary function mask_udf as "com.renxiaozhao.udf.MaskUDF";

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于您的问题,我可以给出以下的回答: Jana语言本身并不支持图形化界面,需要使用第三方库来实现。常见的有Swing、JavaFX等。这里以JavaFX为例,简单介绍一下实现流程: 1. 安装JavaFX库,包括JavaFX运行时库和JavaFX开发库。 2. 新建工程,创建主窗口和登录窗口。 3. 在登录窗口中添加用户名和密码的输入框、登录和取消按钮。 4. 设计安全登录模块,包括用户名和密码的加密和解密。 5. 实现登录功能,包括输入框的数据获取、加密和解密、与数据库的验证等。 6. 在提示和输出部分使用中文,可以使用字符串数组存储中文提示信息,然后在程序中直接调用。 下面是一个简单的示例代码,可以供您参考: ```java import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import java.util.Arrays; public class LoginApp extends Application { // 加密函数,将字符串中的每个字符加上一个固定值 private static String caesar_encrypt(String str, int key) { StringBuilder sb = new StringBuilder(); for (char c : str.toCharArray()) { sb.append((char) ((c + key) % 128)); } return sb.toString(); } // 解密函数,将字符串中的每个字符减去一个固定值 private static String caesar_decrypt(String str, int key) { StringBuilder sb = new StringBuilder(); for (char c : str.toCharArray()) { sb.append((char) ((c - key + 128) % 128)); } return sb.toString(); } @Override public void start(Stage primaryStage) { // 创建GridPane布局 GridPane gridPane = new GridPane(); gridPane.setPadding(new Insets(10)); gridPane.setHgap(10); gridPane.setVgap(10); // 添加用户名和密码的输入框 Label label_username = new Label("用户名:"); TextField textField_username = new TextField(); Label label_password = new Label("密 码:"); PasswordField passwordField_password = new PasswordField(); gridPane.add(label_username, 0, 0); gridPane.add(textField_username, 1, 0); gridPane.add(label_password, 0, 1); gridPane.add(passwordField_password, 1, 1); // 添加登录和取消按钮 Button button_login = new Button("登录"); Button button_cancel = new Button("取消"); gridPane.add(button_login, 0, 2); gridPane.add(button_cancel, 1, 2); // 设置登录按钮的事件处理函数 button_login.setOnAction(event -> { // 获取用户名和密码 String username = textField_username.getText(); String password = passwordField_password.getText(); // 加密用户名和密码 int key = 3; // 固定密钥 String encrypted_username = caesar_encrypt(username, key); String encrypted_password = caesar_encrypt(password, key); // 在控制台输出加密后的用户名和密码 System.out.println("加密后的用户名:" + encrypted_username); System.out.println("加密后的密码:" + encrypted_password); // 解密用户名和密码 String decrypted_username = caesar_decrypt(encrypted_username, key); String decrypted_password = caesar_decrypt(encrypted_password, key); // 在控制台输出解密后的用户名和密码 System.out.println("解密后的用户名:" + decrypted_username); System.out.println("解密后的密码:" + decrypted_password); // TODO: 验证用户名和密码是否正确,跳转到主界面 }); // 设置取消按钮的事件处理函数 button_cancel.setOnAction(event -> { // 清空输入框 textField_username.setText(""); passwordField_password.setText(""); }); // 创建Scene Scene scene = new Scene(gridPane, 300, 150); // 设置主窗口的标题和Scene primaryStage.setTitle("登录窗口"); primaryStage.setScene(scene); // 显示主窗口 primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 注意:这是一个简单的示例代码,仅供参考,实际使用中需要根据具体需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值