使用 spark sql 的 intelliJ 上不相关的歧义方法调用错误

Irrelevant ambigious method call error on intelliJ with spark sql

提问人:Anis Smail 提问时间:10/23/2017 更新时间:3/24/2019 访问量:1815

问:

此 spark sql 代码编译并运行,但 intelliJ (idea-IU-172.4343.14) 显示“Ambigious 方法调用”错误。

enter image description here

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>
java intellij-idea apache-spark-dataset

评论

2赞 millimoose 10/23/2017
如果 IntelliJ 的行为与 javac 编译器相比存在差异,请将其作为错误报告给 JetBrains:youtrack.jetbrains.com/issues/IDEA
0赞 Anis Smail 10/23/2017
行为并没有真正的差异,因为在 spark sql 代码中,过滤器方法是重载的,有一个 java 特定的 fitler 和一个 scala 特定的过滤器,直到最新版本 intelliJ 设法选择正确的一个。
0赞 millimoose 10/23/2017
没错,但是如果你的项目设置得当,那么:1.Scala函数不应该在源文件的命名空间中;或 2.这是 Java 编译器具有解析规则的歧义。不管怎样,这似乎是IDEA处理事情的一个错误,我不确定这里的任何人都能解决。(现在,如果 javac 编译器也在抱怨,那很可能是我们可以帮助解决的程序员错误。
0赞 Anis Smail 10/23/2017
你是对的,这是一个 IntelliJ 错误。只需更新到 idea-IU-173(目前是 EAP)就为我解决了。
0赞 Anis Smail 12/19/2018
该错误在下一个版本中又回来了。

答:

-1赞 Yoga Gowda 9/26/2018 #1

我在 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));
4赞 perascotta 11/19/2018 #2

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

评论

1赞 Anis Smail 11/19/2018
你是对的!除了我不能使用这个解决方案,因为在同一个项目中,我也有 scala 代码。
2赞 Abhi 3/24/2019 #3

删除 Spark 核心依赖项时,它运行良好。

尝试在 Spark sql 依赖项下方使用相同的代码。

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