我有CSV格式的文件,其中包含與列「ID」,「時間戳」,「行動」,「價值」和「位置」的表。 我想一個函數應用於表中的每一行,我已經寫在R上的代碼如下:如何將函數應用於SparkR中的每一行?
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)
我擡頭警告消息的條件具有長度> 1且僅第一個元素將被用來和我發現一些https://stackoverflow.com/a/29969702/4942713。這讓我不知道在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)
您可以使用sparklyr(相同的語法比dplyr ) –
@DimitriPetrenko如果我需要使用SparkR,該怎麼辦? SparkR能達到這個效果嗎? – Scorpion775