繁体   English   中英

递归计算列并添加到 Scala 中的 Spark Dataframe

[英]Recursively calculate columns and add to Spark Dataframe in Scala

我是 Scala 和 Apache Spark 的新手。 我正在尝试计算 Spark dataframe 和 append 中的几列的平均值和标准差,结果是源 dataframe。 我正在尝试递归地执行此操作。 以下是我的 function。

def get_meanstd_data(mergedDF: DataFrame, grpByList: Seq[String]): DataFrame = {

val normFactors = Iterator("factor_1", "factor_2", "factor_3", "factor_4")

def meanStdCalc(df: DataFrame, column: String): DataFrame = {
  val meanDF = df.select("column_1", column).groupBy(grpByList.head, grpByList.tail: _*).
    agg(mean(column).as("mean_" + column))
  val stdDF = df.select("column_1", column).groupBy(grpByList.head, grpByList.tail: _*).
    agg(stddev_pop(column).as("stddev_" + column))
  val finalDF = meanDF.join(stdDF, usingColumns = grpByList, joinType = "left")
  finalDF
}

def recursorFunc(df: DataFrame): DataFrame = {
  @tailrec
  def recursorHelper(acc: DataFrame): DataFrame = {
    if (!normFactors.hasNext) acc
    else recursorHelper(meanStdCalc(acc, normFactors.next()))
  }
  recursorHelper(df)
}
val finalDF = recursorFunc(mergedDF)
finalDF

}

但是当我调用 function 时,生成的 dataframe 仅包含“factor_4”的平均值和标准差。 如何获得 dataframe 的平均值和标准偏差附加到原始 dataframe?

任何帮助深表感谢。

可能您不需要使用自定义递归方法,您可以使用fold 类似于将normFactors创建为List并使用foldLeft

val normFactors = Iterator("factor_1", "factor_2", "factor_3", "factor_4")

normFactors.foldLeft(mergedDF)((df, column) => meanStdCalc(df, column))

foldLeft允许您使用DataFrame作为累加器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM