我正在通过以下方式将csv作为数据框读取:
df.groupBy("col1", "col2","col3")
然后我按如下三列分组,返回一个RelationalGroupedDataset
def ModelFunction(daf: DataFrame) = {
//do some calculation
}
我希望每个分组数据帧都通过以下功能发送
df.groupBy("col1", "col2","col3").ModelFunction();
例如,如果我有col1有2个唯一(0,1)值,col2有2个唯一值(1,2),col3有3个唯一值(1,2,3)那么我想通过每个组合分组到模型函数就像col1 = 0,col2 = 1,col3 = 1我将有一个数据帧,我想将它传递给ModelFunction,依此类推三个列的每个组合。
我试过
{
"status": "success",
"stories": [{
"json_build_object": {
"CNN": []
}
},
{
"json_build_object": {
"FOX": []
}
},
{
"json_build_object": {
"Huffpost": []
}
},...
但它会引发错误。
感谢任何帮助。
答案 0 :(得分:2)
简短的回答是你不能这样做。您只能在RelationalGroupedDataset上执行聚合函数(您编写为UDAF或org.apache.spark.sql.functions中内置的函数)
我看到它的方式有几种选择:
选项1:每个独特组合的数据量足够小,与其他组合相比不会偏差太多。
在这种情况下,你可以这样做:
val grouped = df.groupBy("col1", "col2","col3").agg(collect_list(struct(all other columns)))
grouped.as[some case class to represent the data including the combination].map[your own logistic regression function).
选项2:如果组合总数足够小,您可以这样做:
val values: df.select("col1", "col2", "col3").distinct().collect()
然后循环遍历它们,通过执行过滤器从每个组合创建一个新的数据框。
选项3:编写自己的UDAF
这可能不够好,因为数据在流中没有迭代的能力,但是,如果你有一个匹配的逻辑回归的实现,你可以尝试写一个UDAF来做到这一点。例如,请参阅:How to define and use a User-Defined Aggregate Function in Spark SQL?