Scala Spark - 定义的非法开始

sha*_*ker 6 scala apache-spark jupyter-notebook

这可能是一个愚蠢的新手错误,但我在运行我认为是基本 Scala 代码时遇到错误(在 Spark 笔记本中,通过 Jupyter 笔记本):

val sampleDF = spark.read.parquet("/data/my_data.parquet")

sampleDF
  .limit(5)
  .write
  .format("jdbc")
  .option("url", "jdbc:sqlserver://sql.example.com;database=my_database")
  .option("dbtable", "my_schema.test_table")
  .option("user", "foo")
  .option("password", "bar")
  .save()
Run Code Online (Sandbox Code Playgroud)

错误:

<console>:1: error: illegal start of definition
    .limit(5)
    ^
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

And*_*kin 10

对 jupyter 内部结构一无所知,但我怀疑它是 jupyter-repl 交互的产物。sampleDF出于某种原因被认为是一个完整的声明本身。尝试

(sampleDF
  .limit(5)
  .write
  .format("jdbc")
  .option("url", "jdbc:sqlserver://sql.example.com;database=my_database")
  .option("dbtable", "my_schema.test_table")
  .option("user", "foo")
  .option("password", "bar")
  .save())
Run Code Online (Sandbox Code Playgroud)

  • 那解决了,谢谢。我觉得这是他们很久以前就应该解决的问题...... (2认同)
  • @shadowtalker 也许将其报告为 jupyter bug,我不知道......?然而,我的估计是:如果它是建立在普通的 scala repl 之上,那么修复起来可能会非常困难。分号推理和交互式 repl 可能有点棘手...... (2认同)

Dog*_*027 5

Jupyter 会尝试将每一行解释为一个完整的命令,因此sampleDF首先将其解释为有效的表达式,然后移动到下一行,从而产生错误。将点移到上一行,让解释器知道“还有更多的东西要来了”:

sampleDF.
  limit(5).
  write.
  format("jdbc").
  option("url", "jdbc:sqlserver://sql.example.com;database=my_database").
  option("dbtable", "my_schema.test_table").
  option("user", "foo").
  option("password", "bar").
  save()
Run Code Online (Sandbox Code Playgroud)