Spark DataFrame:对组进行操作

时间:2015-05-20 16:07:53

标签: scala dataframe apache-spark grouping

我有一个我正在操作的DataFrame,我希望按一组列进行分组,并在其余列上按组操作。在常规RDD - 土地上,我认为它看起来像这样:

rdd.map( tup => ((tup._1, tup._2, tup._3), tup) ).
  groupByKey().
  forEachPartition( iter => doSomeJob(iter) )

DataFrame - 土地上我会这样开始:

df.groupBy("col1", "col2", "col3")  // Reference by name

但是如果我的操作比GroupedData提供的平均/最小/最大/计数更复杂,那么我不确定如何对这些组进行操作。

例如,我想为每个("col1", "col2", "col3")组构建一个MongoDB文档(通过遍历组中的关联Row),缩小到N分区,然后插入将文档转换为MongoDB数据库。 N限制是我想要的最大并发连接数。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以进行自我加入。首先得到小组:

val groups = df.groupBy($"col1", $"col2", $"col3").agg($"col1", $"col2", $"col3")

然后您可以将其加入原始DataFrame:

val joinedDF = groups
  .select($"col1" as "l_col1", $"col2" as "l_col2", $"col3" as "l_col3)
  .join(df, $"col1" <=> $"l_col1" and $"col2" <=> $"l_col2" and  $"col3" <=> $"l_col3")

虽然这可以获得与您最初完全相同的数据(以及3个额外的冗余列),但您可以执行另一个连接以添加具有与之关联的(col1,col2,col3)组的MongoDB文档ID的列。行。

无论如何,根据我的经验,加入和自联接是处理DataFrames中复杂内容的方式。