我有一个真正简单的 Zeppelin 笔记本,包含三个段落 - 基于 Zeppelin-Demo 笔记本,但唯一的区别是bankText RDD 是使用 textFile 方法创建的。
第 1 段:
%sh
wget http://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip
unzip bank.zip
第 2 段:
val bankText = sc.textFile("bank.zip")
case class BankRow(age: Integer, job: String, marital: String, education: String, balance: Integer)
val bank2 = bankText.map(s => s.split(";")).filter(s => s(0) != "\"age\"").map(
s => BankRow(s(0).toInt,
s(1).replaceAll("\"", ""),
s(2).replaceAll("\"", ""),
s(3).replaceAll("\"", ""),
s(5).replaceAll("\"", "").toInt
)
).toDF()
bank2.registerTempTable("bank2”)
第 3 段:
%sql
select age, count(1) value
from bank2
where age < 30
group by age
order by age
第 1 段和第 2 段运行良好 - 但第三段出现错误:
org.apache.spark.sql.AnalysisException: no such table bank2; line 2 pos 5 at
org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42) at
org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.getTable(Analyzer.scala:260) at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$7.applyOrElse(Analyzer.scala:268) at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$7.applyOrElse(Analyzer.scala:264) at
org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$resolveOperators$1.apply(LogicalPlan.scala:57) at
org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$resolveOperators$1.apply(LogicalPlan.scala:57)…
Zeppelin 演示运行得很好。我在我的沙箱上运行它,它使用为 Hadoop 2.6 构建的 Spark 1.5.2 (spark-1.5.2-bin-hadoop2.6.tgz) 和 Zeppelin 0.5.5 – 又是一个二进制 zeppelin-0.5.5-incubating-bin -all.tgz。
我怀疑这与 SqlContext 有关 - 因为我相信 Zeppelin 注入(inject)了它自己的 SqlContext。
有什么建议吗?感觉我错过了一些非常简单的东西。
最佳答案
我已经找到解决问题的方法了。 Zeppelin 中有一个错误,我需要重现该错误并将其发送给团队。似乎如果您是 Zeppelin 的菜鸟(像我一样!)并创建自己的 sqlContext,您实际上会破坏笔记本 - 直到您重新启动内核,所有表都会在错误的上下文中注册,并且后续段落的范围内没有该表。重新启动内核解决了问题。
关于apache-spark - Zeppelin 和 SqlContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34536111/