首页 > 解决方案 > Spark-Scala-Intellij java.lang.NoSuchMethodError

问题描述

我正在 Intellij 上使用 Apache Spark 和 Scala。我没有使用 Maven 的经验。我正在尝试组合一个简单的 WordCount 程序并使用 JDK 11、Scala 2.12.12 和 Spark 3.0.1。该项目编译良好,但在运行时,这是我得到的错误:-

Exception in thread "main" java.lang.NoSuchMethodError: 'void scala.util.matching.Regex.<init>(java.lang.String, scala.collection.Seq)'
    at scala.collection.immutable.StringLike.r(StringLike.scala:284)
    at scala.collection.immutable.StringLike.r$(StringLike.scala:284)
    at scala.collection.immutable.StringOps.r(StringOps.scala:33)
    at scala.collection.immutable.StringLike.r(StringLike.scala:273)
    at scala.collection.immutable.StringLike.r$(StringLike.scala:273)
    at scala.collection.immutable.StringOps.r(StringOps.scala:33)
    at org.apache.spark.util.Utils$.<init>(Utils.scala:104)
    at org.apache.spark.util.Utils$.<clinit>(Utils.scala)
    at org.apache.spark.SparkConf.loadFromSystemProperties(SparkConf.scala:75)
    at org.apache.spark.SparkConf.<init>(SparkConf.scala:70)
    at org.apache.spark.SparkConf.<init>(SparkConf.scala:59)
    at WordCount$.main(WordCount.scala:9)
    at WordCount.main(WordCount.scala)

我已经检查了导致此错误的最常见原因。spark-core没有provided依赖,它compile和 Spark 和 Scala 的版本是最新的。

这是代码: -

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

object WordCount {

  def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("Spark Scala WordCount Example").setMaster("local[1]")

    val sc = new SparkContext(conf)

    var map = sc.textFile("/Users/<username>/Downloads/TestFile.csv").flatMap(line => line.split(",")).map(word => (word,1))

    var counts = map.reduceByKey(_ + _)

    counts.collect().foreach(println)

    sc.stop()
  }
} 

这是我用过的 pom.xml:-

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.org.example</groupId>
    <artifactId>Project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <inceptionYear>2008</inceptionYear>
    <packaging>jar</packaging>
    <properties>
        <scala.version>2.12.12</scala.version>
        <spark.version>3.0.1</spark.version>
    </properties>

    <repositories>
        <repository>
            <id>scala-tools.org</id>
            <name>Scala-Tools Maven2 Repository</name>
            <url>http://scala-tools.org/repo-releases</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>scala-tools.org</id>
            <name>Scala-Tools Maven2 Repository</name>
            <url>http://scala-tools.org/repo-releases</url>
        </pluginRepository>
    </pluginRepositories>

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

        <dependency>
            <groupId>org.specs</groupId>
            <artifactId>specs</artifactId>
            <version>1.2.5</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>${spark.version}</version>
            <scope>compile</scope>
        </dependency>

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

    </dependencies>

    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <resources><resource><directory>src/main/resources</directory></resource></resources>
        <plugins>
            
        </plugins>
    </build>
    <reporting>
        <plugins>
            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <configuration>
                    <scalaVersion>${scala.version}</scalaVersion>
                </configuration>
            </plugin>
        </plugins>
    </reporting>

</project>

我之前尝试用 sbt 运行相同的程序,它工作得非常好,但它总是用 maven 返回这个错误。

标签: scalamavenapache-sparkintellij-idea

解决方案


我怀疑这是为您的项目定义的 Scala SDK 的问题。

当我将您复制pom.xml到一个新的 IDEA 项目时,我收到了“No Scala SDK Module”错误。您可以右键单击该项目并选择“添加框架支持”:

右键添加支持

然后选择 Scala 和正确的版本。一旦我这样做并运行该main功能,它就可以正常运行。

如果您已经设置了 Scala 版本,请转到File -> Project Structure -> Global Libraries并确保为项目定义了正确的 Scala SDK:

项目结构


推荐阅读