0

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

在我阅读的其他帖子中,Scala Spark 有一个功能

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: {
4

1 回答 1

0

这个问题的解决方案是 spark read.json 函数不支持我正在使用的 JSON 文件,因为它是如何格式化的。相反,我不得不使用另一个 R 库 jsonlite 来制作我的 JSON 文件,现在它可以按预期工作。这是我现在创建文件时的样子:

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

我希望这对任何人都有帮助!

于 2017-08-08T18:03:14.783 回答