我正在尝试将"moving median“函数实现为一个窗口函数,以便在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")结果是:
Failure(org.apache.spark.sql.AnalysisException:找不到窗口函数median;)
2)作为DataFrame接口调用:
val timeSeriesWithMovingAverage = timeSeries.withColumn("movingAvg", medianFunction(timeSeries("value_column")).over(windowSpec))结果是:
在窗口操作中不支持Failure(java.lang.UnsupportedOperationException: MedianUDAF(value#16)。)
有没有办法使用UDAF作为窗口函数?例如,计算移动中位数(不是移动平均值,而是中位数)。
发布于 2016-06-07 00:05:57
不幸的是,我相信你不能在窗口函数中使用UDFs或UDAFs。窗口函数不是Spark原生的--它们使用配置单元,这排除了使用Spark定义的UDFs和UDAFs。
理论上,我认为你可以直接在Hive中创建UDAF,然后从Spark调用它。但这并不是我以前尝试过的东西--它看起来一定是可能的。
https://stackoverflow.com/questions/37661248
复制相似问题