Spark - 从空 DataFrame 开始在 for 循环中执行 Dataframes 联合
Spark - Performing union of Dataframes inside a for loop starting from empty 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
我有一个数据框,其中包含一个名为 "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