簡體   English   中英

如何在SPARKR DataFrame中的列的每個值上應用函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM