在Apache Spark SQL中将中位数移动为窗口函数(UDAF)

时间:2016-06-06 15:27:48

标签: time-series apache-spark-sql spark-dataframe

我试图实施"移动中位数"作为一个窗口函数,在Apache Spark SQL中使用它。

我试图在Scala中将其实现为UDAF。 Spark的版本是1.6.1。

我试过两种方式来调用我的UDAF("中位数"):

1)作为SQL查询:

val timeSeries = ... // get a DataFrame
...
timeSeries.registerTempTable("time_series")
timeSeries.sqlContext.udf.register("median", new MedianUDAF)
val timeSeriesWithMovingAverage = timeSeries.sqlContext.sql(s"select *, median(value_column) over (partition by metrics_name order by time_column) from time_series")

结果是:

失败(org.apache.spark.sql.AnalysisException:无法找到窗口函数的中位数;)

2)作为DataFrame API调用:

val timeSeriesWithMovingAverage = timeSeries.withColumn("movingAvg", medianFunction(timeSeries("value_column")).over(windowSpec))

结果是:

失败(java.lang.UnsupportedOperationException:MedianUDAF(值#16)在窗口操作中不受支持。)

有没有办法将UDAF用作窗口函数? 例如,计算移动中位数(不是移动平均值,而是中位数)。

1 个答案:

答案 0 :(得分:1)

不幸的是,我认为您无法在窗口函数中使用UDFsUDAFs。窗口函数不是Spark的原生函数 - 它们使用Hive,它排除了使用Spark定义的UDFsUDAFs

理论上,我想您可以直接在Hive中创建UDAF,然后从Spark调用它。但这不是我以前尝试过的东西 - 它似乎一定是可能的。