[英]How do I apply a function on each value of a column in a SPARKR DataFrame?
我對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正式發布中缺少這個?
使用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以一個額外的列開始。
我玩了很多,並沒有一個干凈的解決方案直接將功能應用於列元素,坦率地說,我不確定這是否可行。 盡管如此,使用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
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庫,則需要在工作節點上安裝這些庫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.