从Try块中的scala函数返回多个数据帧

时间:2019-08-08 11:44:28

标签: scala dataframe apache-spark

我在scala中具有如下功能,并且需要返回两个数据帧和匹配错误(如果有问题)

 def createDF(dataFrame: DataFrame): DataFrame Or Every[Problem] = {
       val (p,d) = Try({
          dataFrame
            .groupBy($"id", $"level", $"cust_id", $"p_type_id",$"P_Type")
            .agg(sum($"x") ,
              sum($"y") )
            .filter($"start_date" between ($"sDateRange", $"eDateRange"))

          dataFrame
            .groupBy($"id", $"level", $"cust_id", $"p_type_id",$"P_Type")
            .agg(sum($"x") ,
              sum($"y") )
            .filter($"s_date" between ($"sDateRange", $"eDateRange"))
        )
        (p,d) match {
          case Success(p,d) => Good(p,d)
          case Failure(problem) => {
            log.error("createDF failed", problem)
            Bad(One(Problem("createDF")))
          }
        }
      }

}

我收到以下错误

constructor cannot be instantiated to expected type; [error] found : (T1, T2) [error] required: scala.util.Try[org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]] 


wrong number of arguments for pattern scala.util.Success[Any](value: Any) [error] case Success(p,d) => Good(p,d) 

但是,以上代码无法正常工作并显示错误。有人可以帮我吗

1 个答案:

答案 0 :(得分:0)

您没有从尝试返回数据帧的元组,这就是为什么您得到错误数量的参数异常的原因。同样,您的函数只希望一个数据帧成功返回。我在这里对其进行了简化,以便于查看用法。

 def createDF(dataFrame: DataFrame): (DataFrame,DataFrame)   = {
   val pd = Try({
     val df1 = dataFrame //do ops
     val df2 = dataFrame //do other ops
     (df1, df2)
   }
      )
     pd   match {
        case Success(v) => v
        case Failure(problem) =>
          //handle or throw
          throw new Exception("handle error")
        }
    }