如何对SPARKR数据帧中列的每个值应用函数?

如何对SPARKR数据帧中列的每个值应用函数?,r,sparkr,R,Sparkr,我对斯巴克来说是比较新的。我下载了SPARK 1.4并设置了RStudio以使用SPARKR库。然而,我想知道如何将函数应用于分布式数据帧列中的每个值,有人能帮忙吗? 比如说, 这很好用 myFunc <- function(x) { paste(x , "_hello")} c <- c("a", "b", "c") d <- lapply(c, myFunc) myFunc我经常使用这个函数,没有一个干净的解决方案可以将函数直接应用于列元素,坦率地说,我不确定这在当前是否

我对斯巴克来说是比较新的。我下载了SPARK 1.4并设置了RStudio以使用SPARKR库。然而,我想知道如何将函数应用于分布式数据帧列中的每个值,有人能帮忙吗? 比如说,

这很好用

myFunc <- function(x) { paste(x , "_hello")}
c <- c("a", "b", "c")
d <- lapply(c, myFunc)

myFunc我经常使用这个函数,没有一个干净的解决方案可以将函数直接应用于列元素,坦率地说,我不确定这在当前是否可行。尽管如此,使用COLLECT方法,我们可以执行以下操作:

注意:我正在使用Windows并在powershell中键入

cd D:\Spark\spark-1.4.1-bin-hadoop2.6
./bin/sparkR
c <- c("a", "b", "c")
df <- createDataFrame(sqlContext, as.data.frame(c))
c1 <- collect(df)
myFunc <- function(x) { paste(x , "_hello")}
d <- lapply(c1, myFunc)
df2 <- createDataFrame(sqlContext, as.data.frame(d))
head(df2)
cd D:\Spark\Spark-1.4.1-bin-hadoop2.6
/bin/sparkR

c使用flatMap,可以从数据帧创建RDD,函数应用于所有项

c <- c("a", "b", "c")
df <- createDataFrame(sqlContext, as.data.frame(c))
myFunc <- function(x) { paste(x , "_hello")}
d <- flatMap(df, myFunc)
e <- createDataFrame(sqlContext, d)

spark2.x现在有一个名为dapply的函数,允许您在SparkR数据帧的每个分区上运行R函数

来自文档的代码示例:

# Convert waiting time from hours to seconds.
# Note that we can apply UDF to DataFrame.
schema <- structType(structField("eruptions", "double"), structField("waiting", "double"),
                     structField("waiting_secs", "double"))
df1 <- dapply(df, function(x) { x <- cbind(x, x$waiting * 60) }, schema)
head(collect(df1))
##  eruptions waiting waiting_secs
##1     3.600      79         4740
##2     1.800      54         3240
##3     3.333      74         4440
##4     2.283      62         3720
##5     4.533      85         5100
##6     2.883      55         3300
#将等待时间从小时转换为秒。
#注意,我们可以将UDF应用于数据帧。

schema我对sparkr一无所知,但您是否更需要
name(DF)
而不是
DF$name
?在引擎盖下,Lappy函数仍然是sparkr 1.4的一部分,但目前它不是全局函数,我不知道为什么。您还应该看看map函数。似乎
flatMap
没有在2.1中导出,我不得不这样做:
SparkR:::flatMap(…)
这种方法是串行的。在数据帧上调用collect意味着这不会在执行者之间分配工作。
c <- c("a", "b", "c")
df <- createDataFrame(sqlContext, as.data.frame(c,u=c(1,2,3)))
myFunc <- function(x) { paste(x , "_hello")}
d <- flatMap(df, myFunc)
e <- createDataFrame(sqlContext, d)
# Convert waiting time from hours to seconds.
# Note that we can apply UDF to DataFrame.
schema <- structType(structField("eruptions", "double"), structField("waiting", "double"),
                     structField("waiting_secs", "double"))
df1 <- dapply(df, function(x) { x <- cbind(x, x$waiting * 60) }, schema)
head(collect(df1))
##  eruptions waiting waiting_secs
##1     3.600      79         4740
##2     1.800      54         3240
##3     3.333      74         4440
##4     2.283      62         3720
##5     4.533      85         5100
##6     2.883      55         3300