每当我在网上找到一些Scala / Spark代码时,我想直接将其粘贴到spark-shell中进行试用。 (我在CentOS和Mac OS上都使用Spark-shell和Spark 1.6。)
通常,这种方法效果很好,但是当行以点/句点开始时(表示继续的方法调用),我总是遇到问题。如果我将点移动到上一行,它就会起作用。
示例:以下是我在网上找到的一些代码:
val paramMap = ParamMap(lr.maxIter -> 20)
.put(lr.maxIter, 30)
.put(lr.regParam -> 0.1, lr.threshold -> 0.55)
所以当我将它直接粘贴到spark-shell中时,我看到了这个错误:
scala> val paramMap = ParamMap(lr.maxIter -> 20)
paramMap: org.apache.spark.ml.param.ParamMap =
{
logreg_d63b85553548-maxIter: 20
}
scala> .put(lr.maxIter, 30)
<console>:1: error: illegal start of definition
.put(lr.maxIter, 30)
^
scala> .put(lr.regParam -> 0.1, lr.threshold -> 0.55)
<console>:1: error: illegal start of definition
.put(lr.regParam -> 0.1, lr.threshold -> 0.55)
^
但是,当我将点移动到前一行时,一切正常。
scala> val paramMap = ParamMap(lr.maxIter -> 20).
| put(lr.maxIter, 30).
| put(lr.regParam -> 0.1, lr.threshold -> 0.55)
paramMap: org.apache.spark.ml.param.ParamMap =
{
logreg_d63b85553548-maxIter: 30,
logreg_d63b85553548-regParam: 0.1,
logreg_d63b85553548-threshold: 0.55
}
有没有办法配置spark-shell,以便它接受以点开头的行(或等效地,即使它们不以点结尾也会继续行)?
答案 0 :(得分:6)
必须没有前导空格。
scala> "3"
res0: String = 3
scala> .toInt
res1: Int = 3
scala> "3"
res2: String = 3
scala> .toInt
<console>:1: error: illegal start of definition
.toInt
^
PS:当检测到点时,它可能会忽略空白。关于这个问题here增加了一个JIRA。
答案 1 :(得分:4)
使用:paste命令:
scala> :paste
// Entering paste mode (ctrl-D to finish)
if (true)
print("that was true")
else
print("false")
// Exiting paste mode, now interpreting.
that was true
答案 2 :(得分:3)
你也可以用花括号
包装你的表达式dict
这是因为: REPL是“贪婪的”并消耗您输入的第一个完整语句,因此尝试将代码块粘贴到其中可能会失败
有关详细信息,请参阅:http://alvinalexander.com/scala/scala-repl-how-to-paste-load-blocks-of-source-code
还有一个不错的功能val paramMap = { ParamMap(lr.maxIter -> 20)
.put(lr.maxIter, 30)
.put(lr.regParam -> 0.1, lr.threshold -> 0.55)
}
答案 3 :(得分:0)
Spark外壳程序具有内置机制,允许粘贴多行Spark Scala代码或编写逐行Spark Scala代码:通过将代码包装在括号()
中。不需要将点移动到行尾。
在您的示例中,以val paramMap = (
开始。您可以从此处手动编写每行,也可以粘贴到多行线性回归超参数代码中。在代码封装完成后,再添加一个括号)
。使用此方法时,请勿使用制表符缩进,而应使用两个空格。
完整代码示例:
scala> val paramMap = (ParamMap(lr.maxIter -> 20)
| .put(lr.maxIter, 30)
| .put(lr.regParam -> 0.1, lr.threshold -> 0.55)
| )
答案 4 :(得分:0)
你也可以把句号放在前面,然后就可以了。虽然这可能会打破风格约定
val paramMap = ParamMap(lr.maxIter -> 20).
put(lr.maxIter, 30).
put(lr.regParam -> 0.1, lr.threshold -> 0.55)