Scala:如何在循环中合并数据帧
Posted
技术标签:
【中文标题】Scala:如何在循环中合并数据帧【英文标题】:Scala: How to do union of data frames in the loop 【发布时间】:2018-03-05 17:38:18 【问题描述】:我想用递归方法合并数据框。
我正在递归方法中进行一些计算并过滤数据并存储在一个变量中。在第二次迭代中,我将进行一些计算,然后再次将数据存储在同一个变量中。当我第二次调用该方法时,我的第一个结果消失了。理想情况下,我必须将结果存储在一个临时变量中,我需要这样做合并所有结果,直到递归方法完成执行。
df 中的 Iteration1 输出:
Col1
14
35
df 中的 Iteration2 输出:
Col1
18
20
现在我需要最终输出,
Col1
14
35
18
20
代码:
def myRecursiveMethod(first: List[List[String]],
Inputcolumnsdummy: List[List[String]],
secondInputcolumns: List[List[String]] =
val ongoingResult = doSomeCalculation(first,Inputcolumnsdummy, secondInputcolumns)
我希望我的代码如下所示,
def myRecursiveMethod(first: List[List[String]],
Inputcolumnsdummy: List[List[String]],
secondInputcolumns: List[List[String]]) =
val ongoingResult = doSomeCalculation(first, Inputcolumnsdummy, secondInputcolumns)
Val temp = temp.union(ongoingResult)
【问题讨论】:
为什么不使用 union 或 unionAll 来合并两个数据框? 对myRecursiveMethod
的递归调用在哪里?看起来您必须将 union
的结果作为您应该添加到方法中的另一个参数的值传递。
@Ramesh Maharjan 为了做到这一点,我们的递归方法中应该有两个可用的数据框数据。当控制进入第二次迭代时,第一个结果消失,第二次迭代数据存储在变量中。
你为什么使用递归函数?已经有用于按列递归操作的内置函数和用于按行操作的 udf 函数。您为什么不尝试从其中之一或全部中受益呢?解释问题中的所有细节,例如为什么需要递归函数以及如何访问它。我们会为您提供更好的解决方案。
@Ramesh Maharjan 很好,但我已经完成了一半,所以我想进一步使用递归方法。将结果存储在一个温度中并继续将数据联合到该变量的递归方法是否有任何限制?我不能这样做吗?
【参考方案1】:
您应该尝试:像这样使用union
:df1.union(df2)
或df1.union(computation(df2,...))
。
示例如下:
def doCompute(df: DataFrame): DataFrame =
val tmp: DataFrame = ... // TODO: call to your computation method
tmp.show()
df.union(tmp)
val df1: DataFrame = ...
val df2: DataFrame = ...
val df3: DataFrame = ...
var union_df: DataFrame = df1.union(doCompute(df2)).union(doCompute(df3))
在您的问题中我不明白的一件事是您的函数myRecursiveMethod
递归如何?根据定义,递归函数调用自身。不确定你的问题是否清楚。
【讨论】:
感谢您的回复,是的,从您的示例中,我根据某些 if 条件调用 doCompute 方法定义中的 doCompute 方法,直到满足该方法正在执行的条件。我面临的唯一问题是我必须将每次迭代的数据存储在一个变量中,它应该是全局的,它应该保存数据直到所有迭代完成。最后我想合并数据以显示输出。 tmp 数据我必须存储在一个变量中,我需要将结果与下一次迭代结果合并。 你能重新表述你的问题吗?以上是关于Scala:如何在循环中合并数据帧的主要内容,如果未能解决你的问题,请参考以下文章
如何在for和if循环中获取spark scala数据帧的最后一行的第一列值