【问题标题】:How to build Encoder for Regex class in Scala w/ Spark如何使用 Spark 在 Scala 中为 Regex 类构建编码器
【发布时间】:2020-02-03 15:01:36
【问题描述】:

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

示例: "^.* horses .$" 映射到'horses'; "^. pigs .*$" 映射到 'pigs' 等等

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

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.UnsupportedOperationException No Encoder found for scala.util.matching.Regex

当我没有“implicit val regexMetadataEncoder”行时,它编译并运行良好。这似乎适用于 Databricks,但不适用于 AWS Glue。

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

scala generic encoder for spark case class

感谢您的帮助!

Spark 2.x scala 2.1.1 custom encoder class type mismatch

【问题讨论】:

    标签: regex scala apache-spark aws-glue encoder


    【解决方案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()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2017-10-24
      • 2020-01-04
      • 2020-08-14
      • 2016-03-27
      相关资源
      最近更新 更多