UDF:User Defined Function。用户自定义函数。
scala版本
package cn.spark.study.sql
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.StructType;
import org.apache.spark.sql.types.StringType;
import org.apache.spark.sql.types.DoubleType;
import org.apache.spark.sql.types.StructField;
// 手动导入一个函数
import org.apache.spark.sql.functions._
object UDF {
def main(args:Array[String]){
val conf = new SparkConf()
.setMaster("local")
.setAppName("UDF")
val sc = new SparkContext(conf);
val sqlContext = new SQLContext(sc);
// 构造模拟数据
val names = Array("Leo", "Mary", "Jack", "Tom")
val namesRDD = sc.parallelize(names, 5)
val namesRowRDD = namesRDD.map{name => Row(name)}
val structType = StructType(Array(StructField("name", StringType, true)))
val namesDF = sqlContext.createDataFrame(namesRowRDD, structType)
// 注册一张names表
namesDF.registerTempTable("names")
// 定义和注册自定义函数
// 定义函数:自己写匿名函数
// 注册函数:SQLContext.udf.reqister()
sqlContext.udf.register("strLen", (str:String) => str.length())
// 使用自定义函数
sqlContext.sql("select name, strLen(name) from names")
.collect()
.foreach(println)
}
}
java版本
package cn.spark.study.sql;
import java.util.Arrays;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
/**
* SPARK sql编写UDF自定义函数(JAVA)
* @author leizq120310
*
*/
public class UDF {
public static void main(String[] args) {
SparkConf conf = new SparkConf()
.setMaster("local")
.setAppName("UDF");
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
// 构造模拟数据
List<String> names = Arrays.asList("Leo", "Mary", "Jack", "Tom");
JavaRDD<String> namesRDD = sc.parallelize(names);
JavaRDD<Row> namesRowRDD = namesRDD.map(new Function<String, Row>() {
private static final long serialVersionUID = 1L;
@Override
public Row call(String name) throws Exception {
// TODO Auto-generated method stub
return RowFactory.create(name);
}
});
// 构造元数据
List<StructField> structFields = Arrays.asList(
DataTypes.createStructField("name", DataTypes.StringType, true));
StructType structType = DataTypes.createStructType(structFields);
// 创建DataFrame
DataFrame namesDF = sqlContext.createDataFrame(namesRowRDD, structType);
// 注册一张names表
namesDF.registerTempTable("names");
// 定义和注册自定义函数
// 定义函数:自己写匿名函数
// 注册函数:SQLContext.udf().reqister()
/**
* Function可以使用UDF1到UDF22/21,所表达的意思就是几个参数,2代就指两个参数,10代指10个参数
* return 返回的即为UDF<> 的最后一个参数
*/
sqlContext.udf().register("strLen", new UDF1<String, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public Integer call(String name) throws Exception {
// TODO Auto-generated method stub
return name.length();
}
}, DataTypes.IntegerType);
// 使用自定义函数,查询数据
List<Row> rows = sqlContext.sql("select name, strLen(name) from names").javaRDD().collect();
// 打印数据
for (Row row : rows)
{
System.out.println("name:" + row.get(0) + " 长度:" + row.get(1));
}
// 关闭JavaSparkConf
sc.close();
}
}
文章最后,给大家推荐一些受欢迎的技术博客链接:
- Hadoop相关技术博客链接
- Spark 核心技术链接
- JAVA相关的深度技术博客链接
- 超全干货--Flink思维导图,花了3周左右编写、校对
- 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
- 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
- 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!