在SparkR中指定列

时间:2016-08-12 16:53:25

标签: r apache-spark apache-spark-sql sparkr

我正在尝试将代码从PySpark迁移到SparkR。要修改一些我在PySpark中使用'withColumn'的列。但是,在SparkR中,它会生成一个新列。然后我尝试了像

这样的东西
df$a <- f(df$a)

那很好也很好。但是,假设我想在函数内部或for循环中使用它,并为许多变量重复它​​。在这种情况下,遗憾的是它不起作用:

df[['a']] <- f(df[['a']])

我在执行以下操作时意识到 工作:

df$a <- f(df[['a']])

我绝对需要使用[[<-或其他方式。想法?

1 个答案:

答案 0 :(得分:0)

使用列应该在Spark 2.0.0 +

中正常工作
library(magrittr)

df <- createDataFrame(iris)
df %>% withColumn("Sepal_Length", lit(1)) %>% columns
## [1] "Sepal_Length" "Sepal_Width"  "Petal_Length" "Petal_Width"  "Species" 

但如果使用早期版本,则可以始终使用$<-作为函数:

df <- createDataFrame(sqlContext, iris)

df %>% `$<-`("Sepal_Length", lit(1)) %>% columns
## [1] "Sepal_Length" "Sepal_Width"  "Petal_Length" "Petal_Width"  "Species"

df %>% `$<-`("Sepal_Length", lit(1)) %>% head
##   Sepal_Length Sepal_Width Petal_Length Petal_Width Species
## 1            1         3.5          1.4         0.2  setosa
## 2            1         3.0          1.4         0.2  setosa
## 3            1         3.2          1.3         0.2  setosa
## 4            1         3.1          1.5         0.2  setosa
## 5            1         3.6          1.4         0.2  setosa
## 6            1         3.9          1.7         0.4  setosa

所以你需要使用变量do.call

x <- "Sepal_Length"

do.call(`$<-`, list(df, x, lit(1))) %>% columns