多参表达式Hive UDF

支持的操作符

  • :跳过,即无条件筛选
  • =:等于
  • !=:不等于
  • range:区间内,range[n,m]表示 between n and m
  • nrange:区间外,即not between and
  • in:集合内,in(n,m,j,k)表示 in (‘n’,‘m’,‘j’,‘k’)
  • nin:集合外,即not in
  • regex:正则表达式,regex(^a.*)表示以a字母头

输入与输出

  • 输入:参数个数成双。每一对参数中,参数1为任意类型的筛选列,参数2为字符串类型的条件列。
  • 输出:true or false
select-- 等于空串multi_exp('', '=') as t1,-- 空条件key 跳过比较multi_exp('abc', '') as t2,-- 数字会自动转为string比较multi_exp(123, '=123') as t3,-- string类型multi_exp('abc', '=abc') as t4,multi_exp('abc', '!=aaa') as t5,multi_exp('23', 'range[1,100]') as t6,multi_exp('23', 'nrange[1,100]') as t7,multi_exp('abc', 'in(abc,aaa,bbb,ccc)') as t8,multi_exp('abc', 'nin(abc,aaa,bbb,ccc)') as t9,multi_exp('abc', 'regex(^a.+)') as t10,multi_exp('abc', '=abc', 'abc', '!=aaa', '23', 'range[1,100]', 'abc', 'in(abc,aaa,bbb,ccc)', 'abc', 'regex(^a.+)') t11-- map类型,multi_exp(str_to_map('k1:v1,k2:v2,k3:v3', ',', ':'), '{"k1":"=v1","k2":"=v2"}') as t12, -- k1=v1 and k2=v2, truemulti_exp(str_to_map('k1:v1,k2:v2,k3:v3', ',', ':'), '{"k1":"=v1","k2":"=v3"}') as t13  -- k1=v1 但是k2!=v3, false-- json格式字符串,multi_exp('{"k1":"v1", "k2":"v2", "k3":"v3"}', '{"k1":"=v1","k2":"=v2"}') as t14,  -- k1=v1 and k2=v2, truemulti_exp('{"k1":"v1", "k2":"v2", "k3":"v3"}', '{"k1":"=v1","k3":"=v2"}') as t15  -- k1=v1 但是k3!=v2, false
;

源码

import com.alibaba.fastjson.JSONObject;
import org.apache.hadoop.hive.ql.exec.UDF;import java.util.*;
import java.util.regex.Pattern;public class MultiExpUDF extends UDF {private static final String IGNORE = "";private static final String OPERATOR_EQ = "=";private static final String OPERATOR_NE = "!=";private static final String OPERATOR_RANGE = "range";private static final String OPERATOR_NRANGE = "nrange";private static final String OPERATOR_IN = "in";private static final String OPERATOR_NIN = "nin";private static final String OPERATOR_REGEX = "regex";public boolean evaluate(Object... args) {if (args.length % 2 != 0) {return false;}for (int i = 0; i < args.length; i += 2) {Object originalValue = args[i];Object conditionValue = args[i + 1];// 明细列处理 空值转空串originalValue = originalValue == null ? "" : originalValue;// 跳过指定条件keyif (IGNORE.equals(conditionValue)) {continue;}try {if (originalValue instanceof Map) {@SuppressWarnings("unchecked")Map<String, String> originalMap = (Map<String, String>) originalValue;String conditionStr = conditionValue.toString();if (!conditionStr.startsWith("{") || !conditionStr.endsWith("}")) {return false;}JSONObject conditionJson = JSONObject.parseObject(conditionStr);Set<String> keys = conditionJson.keySet();for (String key : keys) {String condition = conditionJson.getString(key);String original = originalMap.get(key);// 处理map中key为null或空的情况original = original == null ? "" : original;if (compares(original, condition)) {return false;}}} else {String originalStr = originalValue.toString();try {JSONObject originalJson = JSONObject.parseObject(originalStr);String conditionStr = conditionValue.toString();if (conditionStr.startsWith("{") && conditionStr.endsWith("}")) {JSONObject conditionJson = JSONObject.parseObject(conditionStr);Set<String> keys = conditionJson.keySet();for (String key : keys) {String condition = conditionJson.getString(key);String original = originalJson.getString(key);// 处理json中key为null或空的情况original = original == null ? "" : original;if (compares(original, condition)) {return false;}}} else {if (compares(originalStr, conditionStr)) {return false;}}} catch (Exception e) {if (compares(originalStr, conditionValue.toString())) {return false;}}}} catch (Exception e) {return false;}}return true;}private boolean compares(String original, String condition) {if (condition.startsWith(OPERATOR_EQ)) {String expected = condition.substring(1);if (expected.isEmpty()) {return !original.isEmpty();}return !original.equals(expected);} else if (condition.startsWith(OPERATOR_NE)) {String expected = condition.substring(2);if (expected.isEmpty()) {return original.isEmpty();}return original.equals(expected);} else if (condition.startsWith(OPERATOR_RANGE)) {String rangeStr = condition.substring(OPERATOR_RANGE.length() + 1, condition.length() - 1);String[] range = rangeStr.split(",");if (range.length == 2) {try {Comparable<?> originalVal = getComparable(original);Comparable<?> lower = getComparable(range[0]);Comparable<?> upper = getComparable(range[1]);if (originalVal.getClass().equals(lower.getClass()) && originalVal.getClass().equals(upper.getClass())) {@SuppressWarnings("unchecked")int lowerCompare = ((Comparable<Object>) originalVal).compareTo(lower);@SuppressWarnings("unchecked")int upperCompare = ((Comparable<Object>) originalVal).compareTo(upper);return lowerCompare < 0 || upperCompare > 0;}} catch (Exception e) {return true;}}return true;} else if (condition.startsWith(OPERATOR_NRANGE)) {String rangeStr = condition.substring(OPERATOR_NRANGE.length() + 1, condition.length() - 1);String[] range = rangeStr.split(",");if (range.length == 2) {try {Comparable<?> originalVal = getComparable(original);Comparable<?> lower = getComparable(range[0]);Comparable<?> upper = getComparable(range[1]);if (originalVal.getClass().equals(lower.getClass()) && originalVal.getClass().equals(upper.getClass())) {@SuppressWarnings("unchecked")int lowerCompare = ((Comparable<Object>) originalVal).compareTo(lower);@SuppressWarnings("unchecked")int upperCompare = ((Comparable<Object>) originalVal).compareTo(upper);return lowerCompare >= 0 && upperCompare <= 0;}} catch (Exception e) {return true;}}return true;} else if (condition.startsWith(OPERATOR_IN)) {String inStr = condition.substring(OPERATOR_IN.length() + 1, condition.length() - 1);List<String> values = Arrays.asList(inStr.split(","));return !values.contains(original);} else if (condition.startsWith(OPERATOR_NIN)) {String ninStr = condition.substring(OPERATOR_NIN.length() + 1, condition.length() - 1);List<String> values = Arrays.asList(ninStr.split(","));return values.contains(original);} else if (condition.startsWith(OPERATOR_REGEX)) {String patternStr = condition.substring(OPERATOR_REGEX.length() + 1, condition.length() - 1);Pattern pattern = Pattern.compile(patternStr);return !pattern.matcher(original).find();}return true;}private Comparable<?> getComparable(String value) {try {return Integer.parseInt(value);} catch (NumberFormatException e) {try {return Double.parseDouble(value);} catch (NumberFormatException ex) {return value;}}}
//public static void main(String[] args) {MultiExpUDF udf = new MultiExpUDF();// 测试 普通字符串boolean result1 = udf.evaluate( "1", null);System.out.println("非 map 或 json 字符串测试结果: " + result1);}
//        // 测试 含正则
//        boolean result2 = udf.evaluate("abc", "=abc", "aabcdef", "regex(cd.*)");
//        System.out.println("含正则输入测试结果: " + result2);
//
//        // 测试 map 类型
//        Map<String, String> map = new HashMap<>();
//        map.put("key1", "abc");
//        map.put("key2", "efg");
//        map.put("key3", "ab");
//        boolean result3 = udf.evaluate(map, "{\"key1\":\"=abc\",\"key2\":\"!=bcd\",\"key3\":\"in(ab,b)\"}");
//        System.out.println("map 类型测试结果: " + result3);
//
//        // 测试 json 格式字符串测试
//        String jsonStr = "{\"key1\":\"abc\",\"key2\":\"efg\",\"key3\":\"5\"}";
//        boolean result4 = udf.evaluate(jsonStr, "{\"key1\":\"=abc\",\"key2\":\"!=bcd\",\"key3\":\"range[5,10]\"}");
//        System.out.println("json 格式字符串测试结果: " + result4);
//
//        // 测试 map 中 key 为空的情况
//        Map<String, String> map2 = new HashMap<>();
//        map2.put("key1", "abc");
//        map2.put("key2", null);
//        boolean result6 = udf.evaluate(map2, "{\"key1\":\"=abc\",\"key2\":\"=\"}");
//        System.out.println("测试 map 中 key 为空的情况: " + result6);
//
//        // 测试 json 中 key 为空的情况
//        String jsonStr2 = "{\"key1\":\"abc\",\"key2\":null}";
//        boolean result7 = udf.evaluate(jsonStr2, "{\"key1\":\"=abc\",\"key3\":\"=\"}");
//        System.out.println("测试 json 中 key 为空的情况: " + result7);
//
//        // 测试 not in 功能
//        boolean result8 = udf.evaluate("abc1", "nin(abc,def,ghi)");
//        System.out.println("测试 not in 功能结果: " + result8);
//
//        // 测试 not between 功能
//        boolean result9 = udf.evaluate("3", "nrange[4,6]");
//        System.out.println("测试 not between 功能结果: " + result9);
//    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GO后端开发内存管理及参考答案

什么是 Go 的逃逸分析&#xff08;Escape Analysis&#xff09;&#xff0c;为什么需要它&#xff1f; Go 的逃逸分析是一种编译时技术&#xff0c;用于确定变量的生命周期是否超出其创建的函数作用域。通过分析变量的使用方式&#xff0c;编译器能够判断变量是否需要在堆上分…

未来智能系统演进路线:从AGI到ASI的技术蓝图

引言&#xff1a;智能革命的下一个十年 在AI技术突破性发展的当下&#xff0c;我们正站在通用人工智能&#xff08;AGI&#xff09;向人工超级智能&#xff08;ASI&#xff09;跃迁的关键转折点。本文将系统解析未来3-10年的技术演进路径&#xff0c;通过模块化组件插件&#…

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…

AI Agent 核心策略解析:Function Calling 与 ReAct 的设计哲学与应用实践

引言 在人工智能助手和自主Agent快速发展的今天&#xff0c;如何让AI系统不仅能够理解复杂指令&#xff0c;还能有效地执行任务并适应动态环境&#xff0c;成为技术演进的关键问题。本文将深入探讨两种核心的Agent设计策略&#xff1a;Function Calling&#xff08;函数调用&a…

window下配置ssh免密登录服务器

window下配置ssh免密登录服务器 本地windows远程登录我的ssh服务器10.10.101.xx服务器&#xff0c;想要每次都免密登录这个服务器. 记录下教程&#xff0c;防止后期忘记&#xff0c;指导我实现这个过程。 教程 二、实践步骤&#xff1a;Windows 上配置 SSH 免密登录 2.1 确…

树莓派5实现串口通信教程

1&#xff0c;安装依赖 确保已经安装 pyserial&#xff1a; pip3 install pyserial 如果无法用pip3安装&#xff0c;那就创建一个虚拟环境进行安装 如果你想安装最新版本的 pyserial 或其它非 Debian 打包的库&#xff0c;建议在用户目录下创建一个虚拟环境&#xff1a; 安装…

(五)Linux性能优化-CPU-性能优化

性能优化文章参考倪朋飞老师的Linux性能优化实战课程 性能优化方法论 Q&#xff1a;怎么评估性能优化的效果&#xff1f; A&#xff1a;对系统的性能指标进行量化&#xff0c;并且要分别测试出优化前、后的性能指标&#xff0c;用前后指标的变化来对比呈现效果。确定性能的量…

ThreadLocal原理及内存泄漏分析

介绍 每个线程内部都有一个私有的 ThreadLocalMap 实例&#xff0c;用于存储该线程关联的所有 ThreadLocal 变量。 ThreadLocalMap 内部的 Entry 继承自 WeakReference<ThreadLocal<?>>。所以**Entry 的 key&#xff08;即 ThreadLocal 对象本身&#xff09;是通…

Oracle OCP认证考试考点详解083系列18

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 86. 第86题&#xff1a; 题目 解析及答案&#xff1a; 86、使用FLASHBACK TABLE的两个先决条件是什么&#xff1f; A&#xff09;必须对…

git merge合并分支push报错:Your branch is ahead of ‘xxx‘ by xx commits.

git merge合并分支push报错&#xff1a;Your branch is ahead of xxx by xx commits. Your branch is ahead of xxx by xx commits.(use "git push" to publish your local commits)解决方案&#xff1a; git checkout 到要合入的分支&#xff0c;然后&#xff1a; …

英语作文模板

核心原则&#xff1a;三段式结构 ​英文: The core principle is a three-paragraph structure (Introductory paragraph Main body paragraph Concluding paragraph).​中文: 核心原则是采用三段式结构&#xff08;开头引论段 中间主体段 结尾总结段&#xff09;。 模板 …

[安卓按键精灵辅助工具]一些安卓端可以用的雷电模拟器adb命令

在雷电论坛上看到很多adb命令&#xff0c;不过并没有针对安卓按键进行处理&#xff0c;这里做了一下测试&#xff0c;把能用在安卓按键上的adb命令整理出来。 调用adb命令使用的山海插件中的Execute 执行shell命令 adb命令源码如下&#xff1a; Import "shanhai.lua&quo…

uni-app项目怎么实现多服务环境切换

前情 uni-app是我比较喜欢的跨平台框架&#xff0c;它能开发小程序/H5/APP(安卓/iOS)&#xff0c;重要的是对前端开发友好&#xff0c;自带的IDE可视化的运行和打包也让开发体验也非常棒&#xff0c;公司项目就是主推uni-app&#xff0c;现在我的开发模式是用HBuilder X跑项目…

论文阅读:强化预训练

大型语言模型 (LLMs) 的惊人能力很大程度上归功于在海量文本语料库上进行下一词元预测 (Next-Token Prediction, NTP) 的规模化训练。与此同时&#xff0c;强化学习 (Reinforcement Learning, RL) 已成为微调 LLMs、使其与人类偏好对齐或增强特定技能&#xff08;如复杂推理&am…

Java 大视界——Java大数据在智能安防视频监控中的异常事件快速响应与处理机制

​​摘要&#xff1a;​​ 在智慧城市和工业4.0浪潮下&#xff0c;智能安防系统日均产生PB级视频流数据。如何在实时性、准确性、成本三者间取得平衡&#xff0c;成为行业核心挑战。本文将深入探讨​​Java技术栈在大规模视频分析系统中的核心作用​​&#xff1a;基于FlinkJav…

华为云Flexus+DeepSeek征文| 基于Dify-LLM平台应用实践:创建智能知识库问答助手

华为云FlexusDeepSeek征文&#xff5c; 基于Dify-LLM平台应用实践&#xff1a;创建智能知识库问答助手 前言一、相关名词介绍1.1 华为云Flexus X实例介绍1.2 华为云ModelArts Studio介绍 二、本次实践介绍2.1 本次实践环境介绍2.2 Dify平台介绍 三、搭建Dify-LLM开发平台3.1 进…

Spark on yarn的作业提交流程

一、YarnClient 二、YarnCluster 三、详细描述 客户端&#xff08;Client&#xff09;通过YARN的ResourceManager提交应用程序。在此过程中&#xff0c;客户端进行权限验证&#xff0c;生成Job ID和资源上传路径&#xff0c;并将这些信息返回给客户端。客户端将jar包、配置…

MySQL 主从复制与一主多从架构实战详解

文章目录 一、MySQL 主从复制的本质原理 数据同步流程&#xff1a; 主从复制三大线程&#xff1a; 二、主从复制的三种模式 三、一主多从架构设计与应用 应用场景&#xff1a; 优势&#xff1a; 四、单机模拟主从复制&#xff08;实战配置&#xff09; 环境准备&#xff1a…

分布式光纤测温及红外测温系统的区别?

在现代工业监控系统中&#xff0c;温度监测是保障设备安全运行的关键环节。分布式光纤测温&#xff08;DTS&#xff09;和红外测温&#xff08;IR&#xff09;是两种常见的温度监测技术。 本文将介绍这两种技术的原理、优势以及应用场景的区别。 光纤测温技术的原理是利用光纤…

sql优化:使用 exists 优化 in () 或 = ()

1、使用 exists 优化 in () 优化前&#xff1a; select id, order_no, apply_time, apply_dept, apply_operator, purpose, stage, remark from BranchWarehouseApplyMaster where stage 0 and warehouse_id 1 and apply_dept in ( select emp_DeptID from Employee where …