如何编辑SparkDataFrame的架构?

时间:2016-08-25 15:04:42

标签: r apache-spark sparkr

我有一个SparkDataFrame,我想在其中使用dapply()应用一些函数并添加一个新列。

SparkR中的

dapply期望与被调用函数的输出匹配的模式。 如,

#Creating SparkDataFrame

sdf<-as.DataFrame(iris)

#Initiating Schema

schm<-structType(structField("Sepal_Length", "double"),structField("Sepal_Width", "double"),structField("Petal_Length","double"),structField("Petal_Width","double"),structField("Species","string"),structField("Specie_new","string"))

#dapply code
sdf2<-dapply(sdf,function(y)
  {
    y$Specie_new<-substr(y$Specie,nchar(y$Species)-1,nchar(y$Species))
return(y)
},schm)

还有更好的方法吗?我的意思是,如果我有100列,那么这将不是一个可行的选择,在这些情况下我该怎么办?

2 个答案:

答案 0 :(得分:2)

可以说,更好的方法是避免dapply这样的简单案例。您可以轻松使用简单的正则表达式来实现相同的结果:

regexp_extract(df$Species, "^.*(.{2})$", 1)

或Spark SQL函数的组合(SparkR::substrSparkR::length)。

但是,您仍然可以轻松地重用现有架构来创建新架构。假设您要添加新字段foo

foo <- structField("foo", "string")

只提取现有字段并组合它们:

do.call(structType, c(schema(df)$fields(), list(foo)))

答案 1 :(得分:1)

也许有点晚了,但是从Spark v2.2.0开始,添加到零323的答案:

#Initiating Schema    
added_schm <- structType(structField("Specie_new","string"))
schm <- do.call(structType, append(schema(sdf)$fields(), added_schm$fields()))