Spark SQL: Error in query: undefined function错误的解决方法

news/2024/12/29 2:22:07/

本文原文出处: http://blog.csdn.net/bluishglc/article/details/50748937 严禁任何形式的转载,否则将委托CSDN官方维护权益!

问题描述

如果你在Spark SQL上试图调用在HIVE注册的自定义函数(UDF)时,你可能会遇到这样的错误:

Spark SQL: Error in query: undefined function xxxxxx

这个问题发生在Spark 1.5.0, 1.5.1和1.5.2版本上,对此Spark官方有一个专门的bug report: https://issues.apache.org/jira/browse/SPARK-11191

简单说, 引起这个bug的原因是Spark SQL在与HIVE的(主要是Hive的元数据)交互上,在UDF方面有问题,导致Spark SQL无法正确的得到UDF的信息。针对这个问题最简单的解决方法当然是升级Spark,但是可能受制于其他因素,我们无法升级,这时就需要从别的途径来解决这个问题了。

解决方案

这里提供一个参考的解决方案,这个方案的思路是:绕过HIVE,直接在Spark上注册UDF。但这里有一个地方需要斟酌的地方,那就是在哪里和什么样的时机去注册UDF。这里有一个假定,即:所有的SQL语句是抽离到专门的SQL文件中去,然后通过spark-sql -f /your/sql/file 的方式来执行的,通常我们认为这是更加规范的做法,而不是在scala或java代码中去嵌入sql语句,那么在这样一个前提下,注册UDF的入口应该是spark-sql这个脚本的初始化环节中的某个地方,通过浏览Spark源码,我们得知spark-sql的入口是

org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver

而SparkSQLCLIDriver会通过

org.apache.spark.sql.hive.thriftserver.SparkSQLEnv#init

去初始化一个HiveContext, 这个HiveContext就是spark-sql启动后建立的hiveContext实例,同时也是后续SQL执行时使用的hiveContext实例,因此在这个实例的初始化方法就是我们注册我们的UDF的入口,我们可以在

hiveContext.setConf("spark.sql.hive.version", HiveContext.hiveExecutionVersion)

这一行之后添加注册UDF的代码:

hiveContext.udf.register("your_function_name",yourFunction _)   

修改完成之后重新编译,把编译后的SparkSQLEnv的所有class文件更新到各个节点的spark的jar包中就可以了。


http://www.ppmy.cn/news/475061.html

相关文章

新一代直播传输协议SRT

Photo by Vlad Alexandru Popa from Pexels SRT协议是基于UDT的传输协议,保留了UDT的核心思想和机制,抗丢包能力强,适用于复杂的网络。在LiveVideoStack线上分享中,新浪音视频架构师 施维对SRT协议的原理、优缺点特性以及在流媒体…

rtmp over quic直播服务--mediago

mediago mediago的github地址: https://github.com/runner365/mediago_bin 1. 什么是mediago quic是基于udp的下一代高质量传输协议。mediago用quic协议来传输rtmp直播流。 mediago在实现普通rtmp over tcp的基础上,同时实现rtmp over quic的服务,提供…

2023年前端面试汇总 - JavaScript

1. 数据类型 1.1. JavaScript有哪些数据类型,它们的区别? JavaScript共有八种数据类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。 其中 Symbol 和 BigInt 是ES6 中新增的数据类型: Symbol …

三星Cortex-A53八核6818核心板

友坚三星Cortex-A53八核6818核心板采用强悍八核64位处理器,数据处理带宽大幅加大,能效提升,运算速度和视频读取速度更快。配备2GDDR3内存,性能提升的同时,数据交换速度也提高,整机运行效率大幅提升&#xf…

iPhone 6传闻:三星仍为苹果生产A8芯片

上周的报道称台积电将成为苹果A8芯片的唯一制造商,三星不再为苹果生产新版iPhone和iPad所使用的芯片,然而据韩媒ZDNet报道,三星仍将进行A8芯片生产,尽管传闻显示该公司正遭遇A8芯片产率过低的问题。 传三星仍为苹果生产A8芯片&…

第6章 放大器的频率特性

6.1 概述 关心稳态响应,令拉氏变换的sjw,实现从复频域到频域的转换。频率响应的实际求解:代入电阻、电容的复频率阻抗,。模拟电路(低频)一般不考虑电感sL。相频特性:时域上反映输出对输入的延迟…

三星S5690 安卓2.3.6 实现HOME键唤醒

三星S5690这个机子的电源键在侧边,还比较小,不好按,经常按不中, 对于我这个用惯了HOME键唤醒手机的人来说,很不方便。 网上搜了好久都没有找到有价值的信息,后来直接把所有的 /system/usr/keylayout/ …