REPL
交互式解释器环境
Read(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循环)
python,scala都提供原生的REPL ,例如在scala命令行内,键入scala代码,会直接返回结果
既可以作为一个独立的程序运行,也可以包含在其他程序中作为整体程序的一部分使用
Zeppelin0.7.2目前不支持java的原因
当前spark解释器只支持scala,虽然提供了javaSparkContext的一个实例jsc,但并没有为它提供初始化,
我对spark解释器的源码进行了阅读,通过调用scala的REPL执行scala代码
scala调用REPL的关键代码:使用反射,将代码扔到repl中执行
/**
* intp - org.apache.spark.repl.SparkIMain (scala 2.10)
* intp - scala.tools.nsc.interpreter.IMain; (scala 2.11)
*/
private Results.Result interpret(String line) {
return (Results.Result) Utils.invokeMethod(
intp,
"interpret",
new Class[] {String.class},//方法的参数列表
new Object[] {line});//方法执行时要用的实参
}
代码的执行结果直接通过控制台输出,在这之前做了输出重定向,所以直接重定向到InterpreterOutputStream输出(提供了write方法,以字节数组的形式输出)。并不做拦截或返回,这也是为什么dataset.show的输出没有直接提供Zeppelin强大的可视化功能,不过提供了其他解决办法:zeppelincontext类封装了各种输出形式的实现,包括input,chexkbox等表单,show方法封装了dataframe的可视化图表形式输出等,如果想让dataset拥有和select语句在Zeppelin中一样强大的可视化效果,自己调用z.show方法即可
Scala REPL
scala REPL文档
http://docs.scala-lang.org/overviews/repl/overview.html
IMain
http://www.scala-lang.org/api/2.12.1/scala-compiler/scala/tools/nsc/interpreter/IMain.html
scala代码解释器
compile()加载一个完整的Scala文件
interpret()根据用户的请求执行一行Scala代码
bind()将对象绑定到一个变量,然后可以被稍后解释的代码使用
整体方法基于:编译所请求的代码,然后使用Java类加载器和Java反射来运行代码并访问其结果
细节:一个单独的编译器实例用于累积所有成功编译或解释的Scala代码
为了“解释”一行代码,编译器将生成一个新对象,其中包含代码,和公共成员(以导出由该代码定义的所有变量)
要提取解释的结果显示给用户,将创建第二个“结果对象”,导入由上述对象导出的变量,然后导出名为“