spark-shell无法解析以点/句点

时间:2016-04-12 20:03:33

标签: scala apache-spark

每当我在网上找到一些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,以便它接受以点开头的行(或等效地,即使它们不以点结尾也会继续行)?

5 个答案:

答案 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) }

请参阅http://docs.scala-lang.org/overviews/repl/overview.html

答案 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)