簡體   English   中英

如何使用 Spark 在 Scala 中為正則表達式 class 構建編碼器

[英]How to build Encoder for Regex class in Scala w/ Spark

我想構建一個結構,將正則表達式模式鏈接到某些文本中的特征描述。

示例:“^.* 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 火花箱通用編碼器 class

謝謝您的幫助!

Spark 2.x scala 2.1.1 自定義編碼器 class 類型不匹配

得到它的工作。 我在正確聲明我的編碼器時遇到了問題。 以下是我的工作代碼的關鍵部分:

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()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM