Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark udf初始化_Scala_Apache Spark_Apache Spark Sql_User Defined Functions - Fatal编程技术网

Scala Spark 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

我想在Spark SQL中创建一个自定义的基于正则表达式的UDF。我更喜欢创建内存驻留

 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|
    // +----+-----------+-----+
    

V很好的例子。我是按照注册蜂巢UDF的思路思考的。在这种情况下,关闭将不起作用。我忽略了必须在每个Sql上下文中定义SARK UDF的必要性。@ Zoo323:两个提供的解决方案之间有相关的差异吗?(我主要对表演感兴趣)