我有一个1000列的dataFrame,我试图通过对每列进行一些操作来获取一些统计信息。我需要对每一列进行排序,因此我基本上无法对其进行多列操作。我正在一个名为 processColumn
的函数中执行所有这些列操作def processColumn(df: DataFrame): Double = {
// sort the column
// get some statistics
}
为了完成这项工作,我将数据帧保存在内存中,并对其进行scala多线程处理。所以,代码是这样的
假设初始数据帧是df
df.columns.grouped(100).foreach { columnGroups =>
val newDf = df.select(columnGroups.head, columnGroups.tail:_*)
newDf.persist()
val parallelCol = columnGroups.par
parallelCol.tasksupport = new ForkJoinTaskSupport(
new scala.concurrent.forkjoin.ForkJoinPool(4)
)
parallelCol.foreach { columnName =>
val result = processColumn(df.select(columnName))
// I am storing result here to a synchronized list
}
newDf.unpersist()
}
所以,如果你看到,我指定一次运行4个线程。但有时候会发生其中一个线程被卡住,并且我有超过4个活动作业在运行。那些卡住的东西永远不会结束。
我觉得从scala并行集合开始的线程有时间,有时它不会等待所有作业完成。然后那个unpersist被召唤了。所以,积极的工作现在永远停滞不前。我试图通过转到源代码来查明scala集合操作是否超时,但是我们无法确定它是否已经找到了。
任何帮助都将受到高度赞赏。如果您有任何疑问,请告诉我。谢谢。