我正在使用Zeppelin通过MongoDB Spark和angular解释器实现笔记本,我在段落之间的同步中遇到问题,我使用angularWatch运行段落 段落0导入必要的围嘴并配置笔记本以在变量selectedKey更改时运行段落
%spark
import com.mongodb.spark.MongoSpark
import com.mongodb.spark.config.{ReadConfig, WriteConfig}
import com.mongodb.spark.sql._
import org.apache.spark.sql.functions.{asc, _}
import org.bson.Document
import scala.collection.JavaConverters._
import scala.collection.mutable.ListBuffer
z.angularBind("Choosedkey", "type")
val selectedKeyontext = z.getInterpreterContext()
z.angularWatch("Choosedkey", (before:Object, after:Object) => {
z.run(List(2).asJava.asInstanceOf[java.util.List[Object]],
selectedKeyontext)
z.run(List(3).asJava.asInstanceOf[java.util.List[Object]],
selectedKeyontext)
z.run(List(4).asJava.asInstanceOf[java.util.List[Object]], selectedKeyontext)
z.run(List(5).asJava.asInstanceOf[java.util.List[Object]], selectedKeyontext)
})
parghraph 1:为用户文本区域编写查询配置
println("""%angular <h4> Please type the key</h4>
Your key <input ng-model="gg" type="text"></input> <button class="btn btn-
success" ng-click="Choosedkey=gg" >Run !</button>
""")
paraghraph 2负责将参数保存在MongoDB集合中,以便将此参数传递到mongodb解释器中,因为此解释器目前无法与spark和angular解释器交互...
val s=z.angular("Choosedkey")
var TR =new ListBuffer[String]()
TR+= s.toString
val document = sc.parallelize(
Seq(new Document("faits",TR.asJava)))
val writeConfig = WriteConfig(Map("uri" -> "mongodb://127.0.0.1:27017/",
"database" -> "test","collection" -> "Ckey")
MongoSpark.save(document, writeConfig)
第3段:获取用户编写的参数,并在mongodb集合中使用该参数执行查询
%mongodb
q=String(db.Ckey.find({}, { faits: 1 , _id : 0} )[0].faits)
db.Collection_key.insert(db.ColFTTH.find({"d.key":q}).toArray())
db.Collection_key.aggregate([
{ "$unwind": "$c" },
{ "$group": {
"_id": "$c.re",
"count": { "$sum": 1 }
}},
{ $out: "Key_T" }
db.Collection_key.aggregate([
{ "$unwind": "$in" },
{ "$group": {
"_id": "$in.r",
"count": { "$sum": 1 }
}},
{ $out: "Key_I" }
])
paraghraph 4:显示来自paraghraph 3的结果表
%mongodb
db.Key_T.find().sort({count:-1}).limit(10).table()
paraghraph 5:显示paraghraph 3中的表格
%mongodb
db.Key_I.find().sort({count:-1}).limit(10).table()
这里的问题是,当我选择一个键并提交运行时,所有段落都在同一时刻运行,并且每个段都会产生错误,因为第3段花费了5分钟,结果将用在其他段中,而且parghraph 3使用了错误的键,因为没有等待paraghraph 2的执行。请让我感到困惑!