如何将函数应用于SparkR中的每一行?

时间:2017-02-13 13:12:13

标签: r apache-spark sparkr bigdata

我有一个CSV格式的文件,其中包含一个包含列“id”,“timestamp”,“action”,“value”和“location”的表格。 我想将一个函数应用于表的每一行,我已经在R中编写了如下代码:

user <- read.csv(file_path,sep = ";")
num <- nrow(user)
curLocation <- "1"
for(i in 1:num) {
    row <- user[i,]
    if(user$action != "power")
        curLocation <- row$value
    user[i,"location"] <- curLocation
}

R脚本工作正常,现在我想将它应用于SparkR。但是,我无法直接在SparkR中访问第i行,我找不到任何函数来操纵SparkR documentation中的每一行。

为了达到与R脚本相同的效果,我应该使用哪种方法?

另外,正如@chateaur所建议的那样,我尝试使用dapply函数进行编码,如下所示:

curLocation <- "1"
schema <- structType(structField("Sequence","integer"), structField("ID","integer"), structField("Timestamp","timestamp"), structField("Action","string"), structField("Value","string"), structField("Location","string"))
setLocation <- function(row, curLoc) {
    if(row$Action != "power|battery|level"){
        curLoc <- row$Value
    }
    row$Location <- curLoc
}
bw <- dapply(user, function(row) { setLocation(row, curLocation)}, schema)
head(bw)

然后我收到一个错误: error message

我查了警告信息条件有长度&gt; 1,只使用第一个元素,我发现了一些https://stackoverflow.com/a/29969702/4942713。这让我想知道 dapply函数中的参数是否代表我的数据框的整个分区而不是一行< / STRONG>?也许dapply功能不是一个理想的解决方案?

后来,我尝试修改@chateaur建议的功能。我没有使用 dapply ,而是使用 dapplyCollect ,这节省了我指定架构的工作量。它有效!

changeLocation <- function(partitionnedDf) {
    nrows <- nrow(partitionnedDf)
    curLocation <- "1"
    for(i in 1:nrows){
        row <- partitionnedDf[i,]
        if(row$action != "power") {
            curLocation <- row$value
        }
    partitionnedDf[i,"location"] <- curLocation
    }
    partitionnedDf
}

bw <- dapplyCollect(user, changeLocation)

1 个答案:

答案 0 :(得分:2)

Scorpion775,

您应该分享您的sparkR代码。不要忘记数据在R和sparkR中的操作方式不同。

来自:http://docs.h5py.org/en/latest/quick.html

{{1}}

然后你可以在这里查看dapply函数:http://spark.apache.org/docs/latest/sparkr.html

这是一个有效的例子:

{{1}}