我希望能够在Scala jar文件中打包DataFrames并在R中访问它们.最终目标是创建一种方法来访问Python,R和Scala中特定且经常使用的数据库表,而无需为每个表编写不同的库. .
为此,我在Scala中创建了一个jar文件,其中的函数使用SparkSQL库来查询数据库并获取我想要的DataFrame.我希望能够在R中调用这些函数而不创建另一个JVM,因为Spark已经在R中的JVM上运行.但是,JVM Spark使用的内容未在SparkR API中公开.为了使其可访问并使Java方法可调用,我修改了SparkR包中的"backend.R","generics.R","DataFrame.R"和"NAMESPACE"并重新构建了包:
在"backend.R"中,我制作了"callJMethod"和"createJObject"正式方法:
setMethod("callJMethod", signature(objId="jobj", methodName="character"), function(objId, methodName, ...) {
stopifnot(class(objId) == "jobj")
if (!isValidJobj(objId)) {
stop("Invalid jobj ", objId$id,
". If SparkR was restarted, Spark operations need to be re-executed.")
}
invokeJava(isStatic = FALSE, objId$id, methodName, ...)
})
setMethod("newJObject", signature(className="character"), function(className, ...) {
invokeJava(isStatic = TRUE, className, methodName = "<init>", ...)
})
Run Code Online (Sandbox Code Playgroud)
我修改了"generics.R"也包含这些功能:
#' @rdname callJMethod
#' @export
setGeneric("callJMethod", function(objId, methodName, ...) { standardGeneric("callJMethod")})
#' @rdname newJobject
#' @export
setGeneric("newJObject", function(className, ...) {standardGeneric("newJObject")})
Run Code Online (Sandbox Code Playgroud)
然后我将这些函数的导出添加到NAMESPACE文件中:
export("cacheTable", …Run Code Online (Sandbox Code Playgroud)