我试图实施"移动中位数"作为一个窗口函数,在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用作窗口函数? 例如,计算移动中位数(不是移动平均值,而是中位数)。
答案 0 :(得分:1)
不幸的是,我认为您无法在窗口函数中使用UDFs
或UDAFs
。窗口函数不是Spark
的原生函数 - 它们使用Hive,它排除了使用Spark定义的UDFs
和UDAFs
。
理论上,我想您可以直接在Hive中创建UDAF
,然后从Spark调用它。但这不是我以前尝试过的东西 - 它似乎一定是可能的。