当前位置: 首页 > news >正文

hive udf 执行一次调用多次问题

SELECT AppMktApi('http://xx.xx.xx.xx:8282/uph/sou','POST',concat('{','"topicId": "', 'RZRQ', '",','"auditorId": "','ngw', '",','"channels": "', 'ol', '",','"content": "', '融资融券业务指标变动提醒","longtext":"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注', '",','"destIds": ', '[11500435,11500433,11304133,11000126,11000619,11504802]', ',','"destType": "', '1', '",','"priority": "', '5','",','"providerId": "','ngw', '",','"rTopic": "', 'Push_Result','",','"ack": "','1','"}'),-- '{"topicId":"RZRQ","auditorId":"ngw","channels":"ol","content":"融资融券业务指标变动提醒","longtext":"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注","destIds":[11500435,11500433,11304133,11000126,11000619,11504802],"destType":"1","priority":"5","providerId":"ngw","rTopic":"Push_Result","ack":"1"}','Content-Type: application/json') AS result

执行一次调用了两次,查看执行计划

explain extended SELECT AppMktApi('http://xx.xx.xx.xx:8282/uph/sou','POST','{\"topicId\":\"RZRQ\",\"auditorId\":\"ngw\",\"channels\":\"ol\",\"content\":\"融资融券业务指标变动提醒\",\"longtext\":\"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注\",\"destIds\":[11500435,11500433,11304133,11000126,11000619,11504802],\"destType\":\"1\",\"priority\":\"5\",\"providerId\":\"ngw\",\"rTopic\":\"Push_Result\",\"ack\":\"1\"}','Content-Type: application/json') AS result

结果显示

STAGE DEPENDENCIES:
Stage-0 is a root stage
STAGE PLANS:
Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
TableScan
alias: _dummy_table
Row Limit Per Split: 1
GatherStats: false
Select Operator
expressions: '{"response":"{\"errcode\":\"0\",\"msgId\":\"2025090239116000001\"}","curlCommand":"curl -X POST -H \"Content-Type: application/json\" -d '{\"topicId\":\"RZRQ\",\"auditorId\":\"ngw\",\"channels\":\"ol\",\"content\":\"融资融券业务指标变动提醒\",\"longtext\":\"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注\",\"destIds\":[11500435,11500433,11304133,11000126,11000619,11504802],\"destType\":\"1\",\"priority\":\"5\",\"providerId\":\"ngw\",\"rTopic\":\"Push_Result\",\"ack\":\"1\"}' http://xx.xx.xx.xx:8282/uph/sou"}' (type: string)
outputColumnNames: _col0
ListSink

执行计划里仅显示 Stage-0 (属于客户端本地阶段,无分布式计算),且扫描的是 dummy_table (Hive 虚拟表,仅用于返回固定值,无需 MapReduce 处理 )。
原因:

  1. Hive 执行计划的“预执行 + 实际执行”

Hive 在解析含 UDF(这里 AppMktApi; 可理解为自定义函数逻辑)的查询时,可能会先做语法/类型校验,执行计划中的 (type: string),触发一次接口调用;实际执行查询(扫描 _dummy_table; 后处理数据)时,再触发一次。尤其当 UDF 里有固定参数拼接(像你 SQL 里构造固定请求体),Hive 校验阶段可能会提前执行 UDF 逻辑,导致额外调用。

2 解决方案
方案 1:避免 UDF 在校验阶段执行
Hive 校验阶段会执行 UDF(因固定参数/语法验证),可通过延迟 UDF 逻辑执行规避:
方法:参数化请求体(从固定值改为表字段)
把 UDF 里固定拼接的请求体,改成从表中读取字段动态生成。这样 Hive 校验阶段无实际参数,不会触发接口调用。
示例改造:
原 SQL(固定请求体,触发校验调用):

SELECT AppMktApi('http://xx.xx.xx.xx:8282/uph/sou','POST',concat('{','"topicId": "', 'RZRQ', '",','"auditorId": "','ngw', '",','"channels": "', 'ol', '",','"content": "', '融资融券业务指标变动提醒","longtext":"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注', '",','"destIds": ', '[11500435,11500433,11304133,11000126,11000619,11504802]', ',','"destType": "', '1', '",','"priority": "', '5','",','"providerId": "','ngw', '",','"rTopic": "', 'Push_Result','",','"ack": "','1','"}'),-- '{"topicId":"RZRQ","auditorId":"ngw","channels":"ol","content":"融资融券业务指标变动提醒","longtext":"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注","destIds":[11500435,11500433,11304133,11000126,11000619,11504802],"destType":"1","priority":"5","providerId":"ngw","rTopic":"Push_Result","ack":"1"}','Content-Type: application/json') AS result

改造后(请求体存表,动态读取):

  1. 建辅助表存请求体(一次插入,复用):
create table tmp.request_body(
name string
)insert into table tmp.request_body 
select '{"topicId": "RZRQ","auditorId": "ngw","channels": "ol","content": "融资融券业务指标变动提醒","longtext":"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注","destIds": [11500435,11500433,11304133,11000126,11000619,11504802],"destType": "1","priority": "5","providerId": "ngw","rTopic": "Push_Result","ack": "1"}
' as name;
  1. 关联查询动态传参(Hive 校验阶段仅解析逻辑,不执行 UDF):
SELECT AppMktApi('http://xx.xx.xx.xx:8282/uph/sou','POST',--   concat('{','"topicId": "', 'RZRQ', '",','"auditorId": "','ngw', '",','"channels": "', 'ol', '",','"content": "', '融资融券业务指标变动提醒","longtext":"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注', '",','"destIds": ', '[11500435,11500433,11304133,11000126,11000619,11504802]', ',','"destType": "', '1', '",','"priority": "', '5','",','"providerId": "','ngw', '",','"rTopic": "', 'Push_Result','",','"ack": "','1','"}'),-- '{"topicId":"RZRQ","auditorId":"ngw","channels":"ol","content":"融资融券业务指标变动提醒","longtext":"尊敬的投资者您好!您信用账户持有的科泰电源(300153)折算率已调整,敬请关注","destIds":[11500435,11500433,11304133,11000126,11000619,11504802],"destType":"1","priority":"5","providerId":"ngw","rTopic":"Push_Result","ack":"1"}',name,'Content-Type: application/json') AS resul from tmp.request_body 

原理:Hive 校验阶段仅检查表字段引用,不会实际执行 AppMktApi ,仅实际执行阶段(扫描表时)触发 1 次调用。

http://www.dtcms.com/a/362732.html

相关文章:

  • 算法 --- 模拟
  • HDFS读写机制深度解析:分布式存储的核心奥秘
  • Zookeeper分布式锁原理
  • java-设计模式-5-创建型模式-建造
  • 科普:为什么在开发板上运行 Qt 程序时需要在命令后加 -platform linuxfb
  • 少儿舞蹈小程序从0到1(5):搭建关于我们页面
  • 深入浅出 RabbitMQ - SpringBoot2.X整合RabbitMQ实战
  • 23种设计模式-抽象工厂模式
  • 蓝桥杯算法之基础知识(4)
  • Mysql杂志(七)
  • Deepin25安装mysql8.4.5
  • 在ROS中获取并发布UBS式传感器的温湿度
  • PostgreSQL(1) FETCH用法
  • 企业数字安全守护神:IT运维管理系统全面解析,构建坚不可摧的防护体系
  • 简陋的RPC
  • 从代码到组件:C语言动态库(DLL)封装与使用终极指南
  • NV115NV119美光固态闪存NV129NV112
  • 加速交通云建设,移动云为我国交通强国目标提供有力支撑
  • AES-GCM和(AES-CBC+SHA2-25-HAMC组合,并且发方通过每次内容,更新iv,填序使用递增数字)算法比较
  • 系统科学核心概念辨析及其在人工智能领域的应用研究:一个整合性分析框架
  • 分布式光纤传感选型 3 问:你的场景该选 DTS、DAS 还是 BOTDA?
  • 解锁WebRTC在数字人领域的无限潜能
  • 面试问题:c++的内存管理方式,delete的使用,vector的resize和reverse,容量拓展
  • 大数据量模块设置渲染性能优化
  • 白电三巨头 2025 年战局:美的领跑破局,海尔稳健筑垒,格力承压求变
  • Spring 中 Hikari 与 Druid 的详细介绍、对比及同类组件分析
  • go-mapus最简单的离线瓦片地图协作
  • 【Linux系统】万字解析,进程间的信号
  • 并发编程——13 线程池ThreadPoolExecutor实战及其原理分析
  • md5sum -c用法详解