我有一个 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 列,那么这不是一个可行的选择,在这些情况下我应该做什么?
最佳答案
对于像这样的简单情况,可以说更好的方法是避免 dapply
。您可以轻松地使用简单的正则表达式来实现相同的结果:
regexp_extract(df$Species, "^.*(.{2})$", 1)
或 Spark SQL 函数的组合(SparkR::substr
、SparkR::length
)。
不过,您可以轻松地重用现有架构来创建新架构。假设您要添加新字段 foo
:
foo <- structField("foo", "string")
只需提取现有字段并将它们组合起来:
do.call(structType, c(schema(df)$fields(), list(foo)))
关于r - 如何编辑 SparkDataFrame 的架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148749/