提问者:小点点

如何在Scala w/Spark中为Regex类构建编码器


我想构建一个结构,将正则表达式模式链接到某些文本中的功能描述。

例子: "^.* 马。$"映射到'马'; "^. 猪。*$"映射到'猪'等等

此文本有数千种可能的描述,因此将已编译的正则表达式模式与其描述分组将使我能够有效地搜索。以下是我代码的关键部分:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.{Encoder, Encoders}
import scala.util.matching.Regex

object GlueApp {
    case class RegexMetadata(regexName: String, pattern: scala.util.matching.Regex)
    def main(sysArgs: Array[String]) {
      val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
      val sc: SparkContext = new SparkContext()
      val glueContext: GlueContext = new GlueContext(sc)
      val spark = glueContext.getSparkSession
      import spark.implicits._
      Job.init(args("JOB_NAME"), glueContext, args.asJava)

      implicit val regexEncoder = Encoders.kryo[scala.util.matching.Regex]
      implicit val regexMetadataEncoder = Encoders.product[RegexMetadata]
      Job.commit()
}

}

当我运行它时,我收到以下错误:java. lang.Un支持的操作异常没有找到scala.util.match.Regex的编码器

当我没有“隐式val regexMetadataEncoder”行时,它可以正常编译和运行。这似乎适用于数据库,但不适用于AWS胶水。

一些搜索发现了这些类似的问题,但我无法解决我的问题:

scala火花盒类通用编码器

谢谢你的帮助!

Spark 2. xscala2.1.1自定义编码器类类型不匹配


共1个答案

匿名用户

让它正常工作。我在正确声明我的编码器方面遇到了问题。下面是我的工作代码的关键部分:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.{Encoder, Encoders}
import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
import scala.collection.mutable.WrappedArray
import java.util.regex.Pattern
object GlueApp {
    /* RegexConfig -- maps a regex pattern string to a value */
    case class RegexConfig(value: String, patternRegex: String)
    /* RegexMetadata -- maps a compiled regex pattern to a regex config */
    case class RegexMetadata(config: RegexConfig, pattern: java.util.regex.Pattern)
    def main(sysArgs: Array[String]) {
        val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
        val sc: SparkContext = new SparkContext()
        val glueContext: GlueContext = new GlueContext(sc)
        val spark = glueContext.getSparkSession
        import spark.implicits._
        Job.init(args("JOB_NAME"), glueContext, args.asJava)
        implicit val regexMetadataEncoder = Encoders.kryo[RegexMetadata]
        val regexEncoder = Encoders.product[RegexConfig]
        << read file w/ regex patterns and put into regexConfigArray >>
        val regexLocal = for (config <- regexConfigArray) yield 
            RegexMetadata(config, Pattern.compile(config.patternRegex, 
                               Pattern.CASE_INSENSITIVE))
        Job.commit()
    }
}