Spark、Hive UDF函数使用汇总

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

扫描二维码关注公众号,回复: 5250491 查看本文章

+-----+--------+

| 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》

猜你喜欢

转载自blog.csdn.net/qq_31032181/article/details/87803144