使用 spark sql 在 intelliJ 上出现不相关的模棱两可的方法调用错误

Posted

技术标签:

【中文标题】使用 spark sql 在 intelliJ 上出现不相关的模棱两可的方法调用错误【英文标题】:Irrelevant ambigious method call error on intelliJ with spark sql 【发布时间】:2017-10-23 09:52:51 【问题描述】:

此 spark sql 代码可以编译并运行,但 intelliJ (idea-IU-172.4343.14) 显示“Ambigious method call”错误。

public static void main(String[] args) 

    SparkSession session = SparkSession //
            .builder() //
            .appName("idea-ambigious-method-call-bug") //
            .master("local[*]") //
            .getOrCreate();


    Dataset<String> cities = session//
            .sqlContext()//
            .createDataset(Arrays.asList("Paris", "Porto", "London"), Encoders.STRING());

    cities.filter(name -> name.startsWith("P")).show();

以前版本的 IntelliJ 不会发生这种情况。

<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.2.0</version>
    </dependency>
</dependencies>

【问题讨论】:

如果 IntelliJ 的行为与 javac 编译器相比存在差异,请将其作为错误报告给 JetBrains:youtrack.jetbrains.com/issues/IDEA 行为并没有真正的差异,因为在 spark sql 代码中过滤器方法被重载,有一个 java 特定的过滤器和一个 scala 特定的过滤器,直到最新版本 intelliJ 设法选择了正确的。 对,但是如果您的项目设置正确,那么: 1. Scala 函数不应位于源文件的命名空间中;或 2. 这是 Java 编译器有解决规则的歧义。一种或另一种方式似乎是 IDEA 如何处理事情的一个错误,我不确定这里的任何人都可以解决什么问题。 (现在,如果 javac 编译器也在抱怨,那更有可能是我们可以帮助解决的程序员错误。) 你是对的,这是一个 IntelliJ 错误。简单地更新到idea-IU-173(目前是EAP)为我解决了这个问题。 该错误在下一个版本中再次出现。 【参考方案1】:

我认为这可能与 scala 插件有关。该插件使 Spark 的源代码可读,而 IntelliJ 无法选择正确的方法。如果您从 IntelliJ 卸载插件,一切都应该正常。但是,您将失去拥有可读 Spark 源代码的可能性。

【讨论】:

你是对的!除了我不能在同一个项目中使用这个解决方案之外,我还有 scala 代码。【参考方案2】:

当你移除 Spark 核心依赖时它运行良好。

尝试使用略低于 Spark sql 依赖项的相同代码。

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.2.0</version>
</dependency>

【讨论】:

【参考方案3】:

我在 IntelliJ IU-182 上遇到了同样的问题(地图的多重实现),但如果从终端运行相同的程序,则没有任何编译器问题。

    SparkSession session = SparkSession.builder().appName("ALB log Analyzer").master("local[2]").getOrCreate();
    Dataset<ALBLog> accessLogs = session.read().textFile(logFile).map(ALBLog::parseAlbLog,
            Encoders.bean(ALBLog.class));

【讨论】:

以上是关于使用 spark sql 在 intelliJ 上出现不相关的模棱两可的方法调用错误的主要内容,如果未能解决你的问题,请参考以下文章

intellij 中 spark scala 应用程序中的线程“main”java.lang.NoClassDefFoundError:org/apache/spark/sql/catalyst/St

在 IntelliJ 上添加对远程 spark 的依赖

AWS EMR - IntelliJ 远程调试 Spark 应用程序

Intellij Idea搭建Spark开发环境

使用 IntelliJ idea 的 Scala 工作表作为 Apache Spark 的 Scala REPL

Intellij Idea搭建Spark开发环境