如何将一组RelationalGroupedDataset传递给函数?

时间:2017-07-20 00:43:15

标签: scala apache-spark dataframe

我正在通过以下方式将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": []
        }
      },...

但它会引发错误。

感谢任何帮助。

1 个答案:

答案 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?