我对SPARKR相对较新。我下载了SPARK 1.4并设置了RStudio来使用SPARKR库。但是,我想知道如何将函数应用于分布式DataFrame的列中的每个值,有人可以帮忙吗? 例如,
这完美无缺
myFunc <- function(x) { paste(x , "_hello")}
c <- c("a", "b", "c")
d <- lapply(c, myFunc)
如何使这项工作适用于分布式DataFrame。 目的是将“_ hello”附加到DF的列名
的每个值DF <- read.df(sqlContext, "TV_Flattened_2.csv", source = "com.databricks.spark.csv", header="true")
SparkR:::lapply(DF$Name, myFunc)
在SPARK 1.4发布之前的SPARKR alpha版本中似乎有这种能力,为什么现在SPARK 1.4官方版本中缺少这个?
答案 0 :(得分:2)
使用flatMap,您可以从DataFrame创建一个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)
然而,缺点是只能在DataFrame的第一列上执行您所期望的操作,它会跳过所有其他列。这可以在以下示例中看到:
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)
提供与第一个示例完全相同的输出,但是df以一个额外的列开始。
答案 1 :(得分:0)
我玩了很多,并没有一个干净的解决方案直接将功能应用于列元素,坦率地说我不确定这是否可行。尽管如此,使用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)
生成您在R中打印的内容: 1 a _hello 2 b _hello 3 c _hello
以下是有用的资源:
https://spark.apache.org/docs/latest/api/R/index.html
https://spark.apache.org/docs/latest/sparkr.html
https://databricks.com/blog/2015/08/12/from-pandas-to-apache-sparks-dataframe.html
答案 2 :(得分:0)
Spark 2.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
有关更多信息,请参阅此处: http://spark.apache.org/docs/latest/sparkr.html#run-a-given-function-on-a-large-dataset-using-dapply-or-dapplycollect
请注意,如果您使用任何外部R库,则需要在工作节点上安装这些库