多參表達式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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86761.shtml
英文地址,請注明出處:http://en.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 …