我有一个Dataframe,它有一个名为"generationId"的列和其他字段。字段"generationId"采用从1到N的整数值范围(N的上限是已知的,并且很小,在10到15之间),我想以以下方式处理DataFrame(伪代码):
results = emptyDataFrame <=== how do I do this ?
for (i <- 0 until getN(df)) {
val input = df.filter($"generationId" === i)
results.union(getModel(i).transform(input))
}
这里,getN(df)根据一些标准给出该数据帧的N。在循环中,根据与"i"的匹配对输入进行过滤,然后将其提供给某个模型(某个内部库),该模型通过再添加3列来转换输入。
最终,我想得到所有转换后的数据帧的并集,所以我有原始数据帧的所有列,加上模型为每行添加的3个额外列。我不知道如何在每次迭代中初始化结果并统一结果。我确实提前知道结果的确切模式。所以我做了
val newSchema = ...
但我不知道如何将其传递给emptyRDD函数,并构建一个空的Dataframe并在循环中使用它。
此外,如果有一种更有效的方法来进行内部地图操作,请提出建议。
您可以这样做:
(0 until getN(df))
.map(i => {
val input = df.filter($"generationId" === i)
getModel(i).transform(input)
})
.reduce(_ union _)
这样你就不需要担心空的df