使用 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
AWS EMR - IntelliJ 远程调试 Spark 应用程序