【发布时间】:2017-07-01 11:44:34
【问题描述】:
我有一个 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)
我查看了警告消息条件的长度 > 1,并且只会使用第一个元素,我发现了 https://stackoverflow.com/a/29969702/4942713。这让我想知道 dapply 函数中的 row 参数是否代表我的数据框的整个分区而不是单行?也许 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能达到效果吗?
标签: r apache-spark sparkr bigdata