Spark SPEL Выражения UDF - PullRequest
       72

Spark SPEL Выражения UDF

0 голосов
/ 22 февраля 2020

Я пытаюсь использовать выражения SPEL вместе с Spark udf (scala). Выражения SPEL могут быть простыми математическими операциями или пользовательскими функциями вместе с классом java .lang.Math. Когда я запускаю его локально, все работает, находят, но когда я собираю толстый флягу и разворачиваю ее на кирпичах данных, я получаю следующее исключение

SparkException: Job aborted due to stage failure: Task 0 in stage 159.0 failed 4 times, most recent failure: Lost task 0.3 in stage 159.0 (TID 1290, 172.16.9.7, executor 2): java.lang.NoSuchMethodError: org.springframework.core.convert.support.DefaultConversionService.getSharedInstance()Lorg/springframework/core/convert/ConversionService;

Я получаю это исключение, когда SPEL содержит пользовательскую функцию или java .lang.Math, но он работает, тогда есть простые математические операции, такие как сложение, sub, mul et c.

Поиск в Интернете указывает, что это вызвано несовместимостью версий в весенних банках, но 1. я использую только выражение весны и 2. я не вижу несовместимости версий.

Это мой UDF:

 def calculateSpelExpression: (Seq[Double], String, mutable.WrappedArray[String]) => Double = (values: Seq[Double], expression: String, variableNames: mutable.WrappedArray[String]) => {
    val context = new StandardEvaluationContext()
    val parser = new SpelExpressionParser()

    variableNames.zipWithIndex.foreach { iter =>
      val name = iter._1.tail // use .tail in order to remove the '# ' symbol
      val value = values(iter._2)
      context.setVariable(name, value)
    }
    val value = parser.parseExpression(expression).getValue(context)
    if (value.isInstanceOf[Int]) value.asInstanceOf[Int].toDouble
    else value.asInstanceOf[Double]
  }

и мой pom.xml:


    <dependencies>
        <dependency>
            <groupId>com.typesafe</groupId>
            <artifactId>config</artifactId>
            <version>1.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>

        <dependency>
            <groupId>org.scalatest</groupId>
            <artifactId>scalatest_${scala.compat.version}</artifactId>
            <version>3.0.8</version>
            <scope>test</scope>
        </dependency>

 <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-math3</artifactId>
            <version>3.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>


        <dependency>
            <groupId>io.delta</groupId>
            <artifactId>delta-core_2.11</artifactId>
            <version>0.4.0</version>
<!--            <scope>provided</scope>-->
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.10</version>
        </dependency>

        <dependency>
            <groupId>com.datastax.spark</groupId>
            <artifactId>spark-cassandra-connector_2.11</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-all</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

1 Ответ

1 голос
/ 22 февраля 2020

Похоже, у вас есть какая-то старая версия spring-core фляги на пути к классам.

NoSuchMethodError: org.springframework.core.convert.support.DefaultConversionService.getSharedInstance ()

Этот метод был добавлен в 4.3.5.

/**
 * Return a shared default {@code ConversionService} instance,
 * lazily building it once needed.
 * <p><b>NOTE:</b> We highly recommend constructing individual
 * {@code ConversionService} instances for customization purposes.
 * This accessor is only meant as a fallback for code paths which
 * need simple type coercion but cannot access a longer-lived
 * {@code ConversionService} instance any other way.
 * @return the shared {@code ConversionService} instance (never {@code null})
 * @since 4.3.5
 */
public static ConversionService getSharedInstance() {
...