Scala代码在Intellij上运行,但不在Apache Zeppelin笔记本上运行

时间:2019-07-24 09:09:53

标签: scala intellij-idea apache-zeppelin

我已经开发了一些scala代码来迭代java.util.ArrayList [Source],其中Source是带有两个String的case类。

如果我在IntelliJ上运行我的代码,它可以完美运行,当我将其下载到Zeppelin Notebook时,它会给我一个错误。

我的代码是:

source_list.forEach(s => if(s.getPersonalDataFlg.equals("YES")){println(s.getPersonalDataID)})

Apache Zeppelin中的错误是:

<console>:45: error: missing parameter type

有人可以告诉我为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

由于Java的较早版本没有Lambda,因此Scala的较早版本具有完全不同的Function实现。

由于您是在Java 8中添加的forEach上使用ArrayList,因此表明您已经在使用Java版本,而不是Java 8。

在Java 8中引入Lambda以后,Scala的更高版本具有基于Java lambda的Function实现。

现在,您source_list是一个java.util.ArrayList[Source],这意味着source_list.forEach期望使用类型为Consumer<? super Source>的参数,该参数可以用Java lambda代替,例如{{1} }。

您正在为其提供以下scala功能,

(Source s) -> { }

在使用新的Scala版本时,它会编译为适当的lambda,但在旧的scala版本中会失败。

s => if(s.getPersonalDataFlg.equals("YES")){println(s.getPersonalDataID)

此错误表明您的Zeppelin笔记本正在运行旧版本的Scala(很可能是2.11.x甚至是2.10.x)

使用旧版本的Scala,您必须显式创建// this will work with Scala 2.12.x but fail with older versions import java.util.ArrayList val list = new ArrayList[Int]() list.add(1) list.forEach(i => println(i)) 并将其传递给Consumer

forEach