![](/img/trans.png)
[英]How to dynamically add columns based on source columns in spark scala 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.