【问题标题】:How to edit the schema of a SparkDataFrame?如何编辑 SparkDataFrame 的架构?
【发布时间】:2016-08-25 15:04:42
【问题描述】:

我有一个 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 列,那么这将不是一个可行的选择,在这些情况下我应该怎么做?

【问题讨论】:

    标签: r apache-spark sparkr


    【解决方案1】:

    对于像这样的简单情况,可以说更好的方法是避免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)))
    

    【讨论】:

      【解决方案2】:

      可能有点晚了,但从 Spark v2.2.0 开始,添加到 zero323 的答案:

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

      【讨论】:

        猜你喜欢
        • 2015-05-06
        • 2013-11-09
        • 1970-01-01
        • 2022-01-01
        • 2020-06-27
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 2021-10-24
        相关资源
        最近更新 更多