2017-08-03 57 views
0

我想采用我在R中创建的数据框,然后将其转换为JSON对象,然后将该JSON对象读入sparkR。在我目前的项目中,我不能只是将一个数据框传递给SparkR,并且必须执行此迂回方法才能让我的项目正常工作。我也无法首先将本地JSON文件读入sparkR,因此我试图制作一个JSON对象来保存我的数据,然后将其读入sparkR。如何将我在R中创建的JSON对象读入sparkR

在我读其他职位,斯卡拉星火有一个函数

sqlContext.read.json(anotherPeopleRDD) 

这似乎做什么,我试图完成。 SparkR有类似的东西吗?

这里是我现在有工作代码:

.libPaths(c(.libPaths(), '/root/Spark1.6.2/spark-1.6.2-bin-hadoop2./R/lib')) 
Sys.setenv(SPARK_HOME = '/root/Spark1.6.2/spark-1.6.2-bin-hadoop2.6') 
Sys.setenv(R_HOME = '/root/R-3.4.1') 
.libPaths(c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"), .libPaths())) 
Sys.setenv("spark.r.command" = '/usr/bin') 
Sys.setenv(HADOOP_CONF_DIR = "/etc/hadoop/conf.cloudera.yarn") 
Sys.setenv(PATH = paste(Sys.getenv(c('PATH')), '/root/Spark1.6.2/spark1.6.2-bin-hadoop2.6/bin', sep=':')) 

library(SparkR) 
sparkR.stop() 
sc <- sparkR.init(sparkEnvir = list(spark.shuffle.service.enabled=TRUE,spark.dynamicAllocation.enabled=TRUE, spark.dynamicAllocation.initialExecutors="2"), master = "yarn-client", appName = "SparkR") 
sqlContext <- sparkRSQL.init(sc) 
options(warn=-1) 
n = 1000 
x = data.frame(id = 1:n, val = rnorm(n)) 

library(RJSONIO) 
exportJson <- toJSON(x) 
testJsonData = read.json(sqlContext, exportJson) #fails 
collect(testJsonData) 

remove(sc) 
remove(sqlContext) 
sparkR.stop() 
options(warn=0) 

随着错误消息。我得到read.json:

17/08/03 12:25:35 ERROR r.RBackendHandler: json on 2 failed 
Error in invokeJava(isStatic = FALSE, objId$id, methodName, ...) :java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: { 
+0

它肯定听起来像一个*非常*令人费解的方式来完成简单的事情... – desertnaut

回答

0

对这一问题的解决方案是,由于它是如何形成的,我正在使用的JSON文件不受Spark read.json函数的支持。相反,我不得不使用另一个R库jsonlite来创建我的JSON文件,现在它按预期工作。 这是它的外观,当我现在创建的文件,如:

library(jsonlite) 
exportJson <- toJSON(x) 
testJsonData = read.json(sqlContext, exportJson) #fails 
collect(testJsonData) 

我希望帮助任何人!