例如,我需要计算每对(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)
的地图,然后是所有列的数组
所以,我的问题是:
最有效的方法是什么?
dataframe
和groupBy + count
。然后,如何collectAsMap
?我应该使用DataFrame的API或RDD的API?我的输入是一个数据帧。答案 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来处理每个元素。