Spark UDF:
关于UDF:UDF:User Defined Function,用户自定义函数。
创建测试用DataFrame
// 构造测试数据,有两个字段、名字和年龄
略。。。
// 注册一张user表
userDF.createOrReplaceTempView("user")
Spark Sql - UDF用法
下面的UDF的功能是计算某列的长度,该列的类型为String
spark.udf.register("strLen", (str: String) => str.length())
spark.sql("select name,strLen(name) as name_len from user").show
+-----+--------+
| name|name_len|
+-----+--------+
| Leo| 3|
|Marry| 5|
| Jack| 4|
| Tom| 3|
+-----+--------+
DataFrame - UDF用法
DataFrame的udf方法和Spark Sql的名字一样,但属于不同的类
在org.apache.spark.sql.functions里
import org.apache.spark.sql.functions._
//注册自定义函数(通过匿名函数)
val strLen = udf((str: String) => str.length())
//通过withColumn添加列
userDF.withColumn("name_len", strLen(col("name"))).withColumn("isAdult", udf_isAdult(col("age"))).show
//通过select添加列
userDF.select(col("*"), strLen(col("name")) as "name_len", udf_isAdult(col("age")) as "isAdult").show
结果均为
+-----+---+--------+-------+
| name|age|name_len|isAdult|
+-----+---+--------+-------+
| Leo| 16| 3| false|
|Marry| 21| 5| true|
| Jack| 14| 4| false|
| Tom| 18| 3| true|
+-----+---+--------+-------+
withColumn和select的区别
可通过withColumn的源码看出withColumn的功能是实现增加一列,或者替换一个已存在的列,他会先判断DataFrame里有没有这个列名,如果有的话就会替换掉原来的列,没有的话就用调用select方法增加一列,所以如果我们的需求是增加一列的话,两者实现的功能一样,且最终都是调用select方法,但是withColumn会提前做一些判断处理,所以withColumn的性能不如select好。
* 注:select方法和sql 里的select一样,如果新增的列名在表里已经存在,那么结果里允许出现两列列名相同但数据不一样。
Hive UDF:
代码:
package 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) {
// TODO: handle exception
return null;
}
}
}
上面是一个java project 写的 udf
打包成ja,然后导出成jar 传到Linux本地目录
进入hive
add jar /home/hadoop/udf_1_fat.jar; //linux绝对路径地址
CREATE TEMPORARY FUNCTION helloworld AS 'udf.helloudf' //创建一个函数,名为:helloworld
show functions //可以看到所有支持的方法,里面会有helloworld //验证1
使用:// 验证2
hive> select helloworld(hive1.large) from hive1 limit 10;
OK
HelloWorld 94
HelloWorld 115
HelloWorld 258
Time taken: 0.131 seconds, Fetched: 10 row(s)
大数据、数据分析、爬虫群: 《453908562》