如何将Spark RDD从groupByKey转换为R DataFrame

时间:2017-03-16 19:21:05

标签: python r apache-spark pyspark

我使用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数据结构?

0 个答案:

没有答案