我有一个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)
我查了警告信息条件有长度&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)
答案 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}}