SparkSQL使用之如何使用UDF

使用java开发一个helloworld级别UDF,打包成udf.jar,存放在/home/hadoop/lib下,代码如下:

package com.luogankun.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class HelloUDF extends UDF {
    public String evaluate(String str) {
        try {
            return "HelloWorld " + str;
        } catch (Exception e) {
            return null;
        }
    }
}

 Hive中使用UDF

cd $HIVE_HOME/bin
add jar /home/hadoop/lib/udf.jar CREATE TEMPORARY FUNCTION hello AS 'com.luogankun.udf.HelloUDF';
select hello(url) from page_views limit 1;

 SparkSQL中使用UDF

方式一:在启动spark-sql时通过--jars指定

cd $SPARK_HOME/bin
spark-sql --jars /home/hadoop/lib/udf.jar
CREATE TEMPORARY FUNCTION hello AS 'com.luogankun.udf.HelloUDF';

select hello(url) from page_views limit 1;

方式二:先启动spark-sql后add jar

cd $SPARK_HOME/bin
spark-sql
add jar /home/hadoop/lib/udf.jar;
CREATE TEMPORARY FUNCTION hello AS 'com.luogankun.udf.HelloUDF';
select hello(url) from page_views limit 1;

在测试过程中发现并不支持该种方式,会报java.lang.ClassNotFoundException: com.luogankun.udf.HelloUDF

如何解决? 

1)需要先将udf.jar的路径配置到spark-env.sh的SPARK_CLASSPATH中,形如:

export SPARK_CLASSPATH=$SPARK_CLASSPATH:/home/hadoop/software/mysql-connector-java-5.1.27-bin.jar:/home/hadoop/lib/udf.jar

2)再启动spark-sql,直接CREATE TEMPORARY FUNCTION即可;

cd $SPARK_HOME/bin
spark-sql
CREATE TEMPORARY FUNCTION hello AS 'com.luogankun.udf.HelloUDF';
select hello(url) from page_views limit 1;

方式三:Thrift JDBC Server中使用UDF

在beeline命令行中执行:

add jar /home/hadoop/lib/udf.jar;
CREATE TEMPORARY FUNCTION hello AS 'com.luogankun.udf.HelloUDF';
select hello(url) from page_views limit 1;
原文地址:https://www.cnblogs.com/luogankun/p/3970153.html