我有一个大型DataFrame(Spark 1.6 Scala),如下所示:
Type,Value1,Value2,Value3,...
--------------------------
A,11.4,2,3
A,82.0,1,2
A,53.8,3,4
B,31.0,4,5
B,22.6,5,6
B,43.1,6,7
B,11.0,7,8
C,22.1,8,9
C,3.2,9,1
C,13.1,2,3
由此我想按类型分组并应用机器学习算法和/或对每个组执行复杂的功能。 我的目标是并行地对每个组执行复杂的功能。
我尝试了以下方法:
方法1)将Dataframe转换为Dataset,然后使用ds.mapGroups()
api。但是这给了我每个组值的迭代器。
如果我想执行RandomForestClassificationModel.transform(dataset: DataFrame)
,我需要一个只包含特定组值的DataFrame。
我不确定将Iterator转换为mapGroups中的Dataframe是个好主意。
方法2)区分类型,然后映射它们,然后在地图循环中过滤每个类型:
val types = df.select("Type").distinct()
val ff = types.map(row => {
val type = row.getString(0)
val thisGroupDF = df.filter(col("Type") == type)
// Apply complex functions on thisGroupDF
(type, predictedValue)
})
出于某种原因,上面的内容永远不会完成(似乎正在进入某种无限循环)
方法3)探索窗口函数,但没有找到可以提供特定组值的数据框的方法。
请帮忙。