如何选择行并使用SparkR为它们分配新值?

时间:2018-03-28 05:19:00

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

在R编程语言中,我可以做到:

x <- c(1, 8, 3, 5, 6)
y <- rep("Down",5)
y[x>5] <- "Up"

这将导致y向量为("Down", "Up", "Down", "Down", "Up")

现在我的x序列是线性模型拟合上predict函数的输出。 R中的predict函数返回一个序列,而Spark中的predict函数返回一个DataFrame,其中包含test-dataset +列labelprediction的列。

运行

y[x$prediction > .5]

我收到错误:

Error in y[x$prediction > 0.5] : invalid subscript type 'S4'

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

选择行时

您的方法不起作用,因为作为Spark y的产品的predict是Spark(而不是R)数据帧;你应该使用SparkR的filter功能。以下是使用iris数据集的可重现示例:

library(SparkR)
sparkR.version()
# "2.2.1"

df <- as.DataFrame(iris)
df
# SparkDataFrame[Sepal_Length:double, Sepal_Width:double, Petal_Length:double, Petal_Width:double, Species:string]
nrow(df)
# 150

# Let's keep only the records with Petal_Width > 0.2:
df2 <- filter(df, df$Petal_Width > 0.2)    
nrow(df2)
# 116

同时查看docs中的示例。

关于替换行值:

替换Spark数据帧中的行值的标准做法是首先创建一个具有所需条件的新列,然后可能删除旧列;这是一个示例,我们将Petal_Width的值大于0.2的值替换为我们在上面定义的df中的0&#39;

newDF <- withColumn(df, "new_PetalWidth", ifelse(df$Petal_Width > 0.2, 0, df$Petal_Width))
head(newDF)
# result:
  Sepal_Length Sepal_Width Petal_Length Petal_Width Species new_PetalWidth
1          5.1         3.5          1.4         0.2  setosa            0.2
2          4.9         3.0          1.4         0.2  setosa            0.2
3          4.7         3.2          1.3         0.2  setosa            0.2
4          4.6         3.1          1.5         0.2  setosa            0.2
5          5.0         3.6          1.4         0.2  setosa            0.2
6          5.4         3.9          1.7         0.4  setosa            0.0 # <- value changed

# drop the old column:
newDF <- drop(newDF, "Petal_Width")
head(newDF)
# result:
  Sepal_Length Sepal_Width Petal_Length Species new_PetalWidth
1          5.1         3.5          1.4  setosa            0.2
2          4.9         3.0          1.4  setosa            0.2
3          4.7         3.2          1.3  setosa            0.2
4          4.6         3.1          1.5  setosa            0.2
5          5.0         3.6          1.4  setosa            0.2
6          5.4         3.9          1.7  setosa            0.0

该方法也适用于不同的列;以下是值为0或Petal_Width的新列的示例,具体取决于Petal_Length的条件:

newDF2 <- withColumn(df, "something_here", ifelse(df$Petal_Length > 1.4, 0, df$Petal_Width))
head(newDF2)
# result:
  Sepal_Length Sepal_Width Petal_Length Petal_Width Species something_here
1          5.1         3.5          1.4         0.2  setosa            0.2
2          4.9         3.0          1.4         0.2  setosa            0.2
3          4.7         3.2          1.3         0.2  setosa            0.2
4          4.6         3.1          1.5         0.2  setosa            0.0
5          5.0         3.6          1.4         0.2  setosa            0.2
6          5.4         3.9          1.7         0.4  setosa            0.0