Scala Spark udf初始化
我想在Spark SQL中创建一个自定义的基于正则表达式的UDF。我更喜欢创建内存驻留Scala Spark udf初始化,scala,apache-spark,apache-spark-sql,user-defined-functions,Scala,Apache Spark,Apache Spark Sql,User Defined Functions,我想在Spark SQL中创建一个自定义的基于正则表达式的UDF。我更喜欢创建内存驻留 Map[String,Pattern] 其中模式指的是字符串键的已编译正则表达式版本。但要做到这一点,我们需要将地图创建放在UDF的“初始化”函数中 那么Spark udf是否有支持跨调用持久状态的结构(通过Spark SQL) 请注意,配置单元确实支持UDF的生命周期。我使用它来生成解析树,作为初始化的一部分,所以UDF的实际调用是针对闪电般快速的树,而不涉及解析 让我们从导入和一些虚拟数据开始: im
Map[String,Pattern]
其中模式指的是字符串键的已编译正则表达式版本。但要做到这一点,我们需要将地图创建放在UDF的“初始化”函数中
那么Spark udf是否有支持跨调用持久状态的结构(通过Spark SQL)
请注意,配置单元确实支持UDF的生命周期。我使用它来生成解析树,作为初始化的一部分,所以UDF的实际调用是针对闪电般快速的树,而不涉及解析 让我们从导入和一些虚拟数据开始:
import org.apache.spark.sql.functions.udf
导入scala.util.matching.Regex
导入java.util.regex.Pattern
val df=sc.并行化(序号(
(“foo”,“this is bar”),(“foo”,“this is foo”),
(“吧台”、“foobar”),(“吧台”、“foo和foo”)
)).toDF(“类型”、“值”)
和地图:
val模式:Map[String,Pattern]=Seq((“foo”、“*foo.*”)、(“bar”、“*bar.*”)
.map{case(k,v)=>(k,新正则表达式(v).pattern)}
汤玛普先生
现在我看到两种不同的选择:
- 使
成为patterns
udf中引用的广播变量
val patternsBd=sc.broadcast(模式) val typeMatchedViaBroadcast=udf((t:String,v:String)=> patternsBd.value.get(t.map)(m=>m.matcher(v.matches)) df.withColumn(“match”,typeMatchedViaBroadcast($“type”,$“value”)).show // +----+-----------+-----+ //|类型|值|匹配| // +----+-----------+-----+ //| foo |这是bar | false| //|福|这是福|真的| //| bar | foobar |正确| //| bar | foo和foo | false| // +----+-----------+-----+
- 闭包内传递图
def makeTypeMatchedViaClosure(模式:Map[String,Pattern])=udf( (t:String,v:String)=>patterns.get(t.map(m=>m.matcher(v.matches)) val typeMatchedViaClosure=makeTypeMatchedViaClosure(模式) df.withColumn(“match”,typeMatchedViaClosure($“type”,$“value”)).show // +----+-----------+-----+ //|类型|值|匹配| // +----+-----------+-----+ //| foo |这是bar | false| //|福|这是福|真的| //| bar | foobar |正确| //| bar | foo和foo | false| // +----+-----------+-----+