Как создать кодировщик для класса Regex в Scala с Spark - PullRequest
1 голос
/ 05 октября 2019

Я хотел бы построить структуру, которая связывает шаблон регулярного выражения с описанием функции в некотором тексте. Существуют тысячи возможных описаний этого текста, поэтому группировка скомпилированного шаблона регулярного выражения с его описанием позволит мне эффективно выполнять поиск. Ниже приведена ключевая часть моего кода:

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

Он компилируется и работает нормальнокогда у меня нет строки «неявный val regexMetadataEncoder». Похоже, что это работает на Databricks, но не на AWS Glue.

Некоторые поиски нашли эти похожие вопросы, но я не могу решить мою проблему с ними:

универсальный кодировщик scalaдля класса искрового корпуса

Спасибо за помощь!

Spark 2.x scala 2.1.1 несоответствие типов пользовательских кодировщиков

...