Apache spark 我可以在窗口函数中使用UDAFs吗?

Apache spark 我可以在窗口函数中使用UDAFs吗?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我创建了一个用户定义的聚合函数。它将所有累积值连接到一个列表中(ArrayType)。它被称为EdgeHistory 如果我不指定窗口,它可以正常工作。它返回所有列表的数组。但在以下示例中,它失败了: case class ExampleRow(n: Int, list: List[(String, String, Float, Float)]) val x = Seq( ExampleRow(1, List(("a", "b", 1f, 2f), ("c", "d", 2f, 3f)))

我创建了一个用户定义的聚合函数。它将所有累积值连接到一个列表中(
ArrayType
)。它被称为
EdgeHistory

如果我不指定窗口,它可以正常工作。它返回所有
列表的数组。但在以下示例中,它失败了:

case class ExampleRow(n: Int, list: List[(String, String, Float, Float)])

val x = Seq(
  ExampleRow(1, List(("a", "b", 1f, 2f), ("c", "d", 2f, 3f))),
  ExampleRow(2, List(("a", "b", 2f, 4f), ("c", "d", 4f, 6f))),
  ExampleRow(3, List(("a", "b", 4f, 8f), ("c", "d", 8f, 12f)))
)

val df = sc.parallelize(x).toDF()

val edgeHistory = new EdgeHistory()

val y = df.agg(edgeHistory('list).over(Window.orderBy("n").rangeBetween(1, 0)))
它抛出一个错误:

STDERR: Exception in thread "main" java.lang.UnsupportedOperationException: EdgeHistory('list) is not supported in a window operation.
    at org.apache.spark.sql.expressions.WindowSpec.withAggregate(WindowSpec.scala:177)
    at org.apache.spark.sql.Column.over(Column.scala:1052)
    at szdavid92.AnalyzeGraphStream$.main(AnalyzeGraphStream.scala:75)
错误消息似乎非常简单。您似乎无法在windows中定义UDAFs。 我理解正确吗? 为什么会有这样的限制

更新

我尝试使用SQL语法,但得到了一个相关错误

df.registerTempTable("data")
sqlContext.udf.register("edge_history", edgeHistory)

val y = sqlContext.sql(
  """
    |SELECT n, list, edge_history(list) OVER (ORDER BY n ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
    |FROM data
  """.stripMargin)
就是

Exception in thread "main" org.apache.spark.sql.AnalysisException: Couldn't find window function edge_history;
    at org.apache.spark.sql.hive.ResolveHiveWindowFunction$$anonfun$apply$1$$anonfun$applyOrElse$1$$anonfun$3.apply(hiveUDFs.scala:288)
    at org.apache.spark.sql.hive.ResolveHiveWindowFunction$$anonfun$apply$1$$anonfun$applyOrElse$1$$anonfun$3.apply(hiveUDFs.scala:288)

我理解正确吗对为什么会有这种限制因为<2.0中的Spark窗口函数依赖于配置单元到窗口函数。没有本机机制。这是否适用于>=2.0?据我记忆,它应该可以正常工作。我理解正确吗?-对为什么会有这种限制因为<2.0中的Spark窗口函数依赖于配置单元到窗口函数。没有本机机制。这是否适用于>=2.0?据我记忆所及,它应该可以正常工作。