在DataFrame中每两列之间进行一些计算的有效方法

时间:2017-07-20 12:27:28

标签: scala apache-spark

例如,我需要计算每对(x,y)的条件概率,其中x来自col1,y来自col2。如果我使用它并不是很困难:

val df2 = df1.groupBy("col1", "col2").count()

然后我得到了:

 +----+-----+-----+
 |col1|col2 |count|
 +----+-----+-----+
 | A  |[Non]| 1185|
 | B  |[Non]| 4609|
 | B  |[Oui]|  830|
 | A  |[Oui]|  177|
 +--- +-----+-----+

但由于我有超过2列,我需要一个循环来存储所有结果。主要是,我希望每行都有x -> (y, count)的地图,然后是所有列的数组 所以,我的问题是:

最有效的方法是什么?

  1. 喜欢上面的代码(使用dataframegroupBy + count。然后,如何collectAsMap?我应该使用DataFrame的API或RDD的API?我的输入是一个数据帧。
  2. 首先收集所有数据,即以二维数组收集,然后进行计算。
  3. 还是其他一些更好的主意?

1 个答案:

答案 0 :(得分:0)

第一个选项将是您的选择。请记住,spark(collect,collectAsMap等)中的所有collect函数都会触发一个spark动作,在集群上进行计算。首先进行计算(在数据帧上进行map-reduce),当你有需要输出的结果时,在dataframe / rdd上进行收集。 您也可以执行collectAsMap,但另一种方法是在案例类中定义结果:

case class Result(col1: Int, col2:Int, count:Long)
df2.map(row => Result( col1 = row.getAsInt[Int]("col1"), col2 = row.getAsInt[Int]("col2"), count = row.getAsLong[Long]("count"))

之后你在df2上进行收集并且你有一个List [Result]并且可以做foreach来处理每个元素。