我使用Spark pipe()函数将按键(使用groupByKey)分组的数据行传递给R脚本,该脚本在数据上运行分层模型并吐出数据字符串。
但是,分组的Spark RDD有很多填充结构,我必须进行大量的解析才能将它转换为R DataFrame。
这是Spark代码,它将我之前的数据用于管道()中的内容:
.map(lambda p: (p.split(",")[0], ",".join(p.split(",")[1:len(p.split(","))])+"EOL" )) \
.groupByKey().mapValues(list) \
这是Spark结构通过pipe()
的样子(u'1-10-13-8', [u'83845,"srd",-79.6376432430279,38.6874999965503,0.82,0,2013,NA,7,1,1,1,1174.88703492269,4,0,0,0,0,94.4444444444444,0,0,0,0,0,0,5.55555555555556,0,0,NAEOL', u'83845,"srd",-79.6376432430279,38.6874999965503,0.84,0,2013,NA,7,1,1,1,1174.88703492269,4,0,0,0,0,94.4444444444444,0,0,0,0,0,0,5.55555555555556,0,0,NAEOL', u'73437,"srd",-75.5229630639942,39.8124999964486,0.84,0,2013,NA,7,1,1,1,107.637711535396,8,0,0,0,0,0,0,0,0,11.1111111111111,0,0,8.33333333333333,80.5555555555556,0,NAEOL'])
在R中,我想将键解析为一个值,将剩余的行解析为DataFrame。我的Spark代码和我的R代码都有相当多的丑陋(例如,使用EOL替换)以使其成形。
这是用于解析进入R脚本的Spark结构的R代码。
cbpos <- gregexpr(pattern='(\\[)', currentLine)
currentText <- substr(currentLine, cbpos[[1]][1]+1, nchar(currentLine)-2)
currentK <- substr(currentLine, 2, cbpos[[1]][1]-3)
currentKclean <- substr(currentK, 3, nchar(currentK)-1)
currentTextRead <- gsub("u'", "", currentText)
currentTextRead <- gsub("'", "", currentTextRead)
currentTextRead <- gsub("EOL, ", "\n", currentTextRead)
currentTextRead <- gsub("EOL", "", currentTextRead)
con <- textConnection(currentTextRead)
currentValue <- read.csv(con, header=FALSE)
close(con)
是否有更有效的方法将分组数据更自然地转换为R?
使用SparkDataFrame会更容易吗?或者是否有更简单的方法让R按键引用Spark数据结构?