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

本文原文出处: 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包中就可以了。

时间: 2024-12-24 22:45:24

Spark SQL: Error in query: undefined function错误的解决方法的相关文章

windows下PHP中Fatal error Call to undefined function curl_init()的解决方法

参考官方解决方法:http://nz.php.net/manual/en/curl.installation.php 1.php安装目录下的ext文件夹下面是否有php_curl.dll文件,然后右键->属性->详细信息,查看版本号是否和PHP版本一致:2.php.ini文件;extension=php_curl.dll前面的";"去掉如果以上方法还不行的话,请继续往下:3.(如果是windows32位系统)复制 php_curl.dll, ssleay32.dll, li

SQL点滴7—使用SQL Server的attach功能出现错误及解决方法

原文:SQL点滴7-使用SQL Server的attach功能出现错误及解决方法 今天用SQL Server 2008的attach功能附加一个数据库,出了点问题,提示的错误是: Unable to open physical file "D:\Documents\Dalt\XXXX.mdf" Operating system error 5: "5(error not found)" (Microsoft SQL Server: Error 5120)"

php运行出现Call to undefined function curl_init()的解决方法

简单说,调试报错了,Call to undefined function curl_init(). 度了下,大家都说这样可以搞定(WAMP环境): 1.在php.ini中找到extension=php_curl.dll,去掉前面的,php.ini一般在c:\windows下面. 2.在php.ini中找到extension_dir = "ext",去掉前面的;,改为extension_dir = "C:\php5\ext"."C:\php5\ext&quo

PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 的解决方法

我也是PHP新手,通过w3cschool了解了一下php基本原理之后就开写了.但仍是菜鸟. 先不管3DES加密的方法对不对,方法都是网上的,在运行的时候报了个错,把小弟整死了.找来找去终于自己摸出了方法. <?php /** * * PHP版3DES加解密类 * * 可与java的3DES(DESede)加密方式兼容 * * @Author: Luo Hui (farmer.luo at gmail.com) * * @version: V0.1 2008.12.04 * */ class Cr

腾讯信鸽推送&quot;CURL ERROR:name lookup timed out&quot;错误提示解决方法

系统环境:ubuntu12.04 服务端SDK版本:Xg-Push-SDK-PHP-1.1.2 使用官方php sdk demo包向app推送消息,偶尔会出现"CURL ERROR:name lookup timed out"的错误提示,严重影响推送质量.原因是本地系统DNS解析信鸽推送域名超时所致,解决方法是给域名解析文件hosts添加相应的域名IP映射,还能提高推送的执行速度. #vi /etc/hosts 添加下面域名ip映射信息(ip前面不能有空格,ip与域名间至少有一个空格)

MYSQL报Fatal error encountered during command execution.错误的解决方法

{MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command execution. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered attempting to read the resultset. ---> MySql.Data.MySqlClient.MyS

PHP-问题处理Fatal error: Uncaught Error: Call to undefined function simplexml_load_file()

1.问题 今天重新安装了ubuntu,PHP,MySQL,Apache,到测试CMS项目时发生一个错误: Fatal error: Uncaught Error: Call to undefined function simplexml_load_file() 2.解决: 2.1 安装php-xml: sudo apt-get install php-xml 2.2重启apache服务: sudo service apache2 restart

有关使用phpstudy搭建sqli-lab环境搭建时发生Uncaught Error: Call to undefined function mysql_connect()错误

文章更新于2020-1-30 问题描述 Uncaught Error: Call to undefined function mysql_connect() 分析 经查php手册可知 mysql_connect() 在php5以后的版本中不在使用,使用mysqli_conncet()代替,准确的来说是mysql类被mysqli类代替,在php5+版本中可以同时使用mysql类和mysqli类. 解决方案 1.在phpstudy环境下我们可以对php版本进行降级,选择php5+版本即可. 具体操作

php提示Fatal error: Call to undefined function imagecreate()

在php中imagecreate函数是一个图形处理函数,主要用于新建一个基于调色板的图像了,然后在这个基础上我们可以创建一些图形数字字符之类的,但这个函数需要GD库支持,如果没有开启GD库使用时会 undefined 在php中imagecreate函数是一个图形处理函数,主要用于新建一个基于调色板的图像了,然后在这个基础上我们可以创建一些图形数字字符之类的,但这个函数需要GD库支持,如果没有开启GD库使用时会提示Call to undefined function imagecreate()错