SparkR窗口功能

Bam*_*mqf 1 r window-functions apache-spark apache-spark-sql sparkr

我从JIRA发现1.6版SparkR已经实现了包含lag和的窗口函数rank,但是over函数还没有实现.如何在lag没有(不是这样)的情况下使用像函数这样的窗口函数?有人能提供一个例子吗?overSparkRSparkSQL

zer*_*323 6

Spark 2.0.0+

SparkR提供DSL包装over,window.partitionBy/ partitionBy,window.orderBy/ orderByrowsBetween/ rangeBeteen功能.

Spark <= 1.6

不幸的是,它在1.6.0中是不可能的.虽然lag已经实现了一些窗口函数,包括已经实现但SparkR不支持窗口定义,这使得这些函数完全没用.

只要SPARK-11395没有解决,唯一的选择就是使用原始SQL:

set.seed(1)

hc <- sparkRHive.init(sc)
sdf <- createDataFrame(hc, data.frame(x=1:12, y=1:3, z=rnorm(12)))
registerTempTable(sdf, "sdf")

sql(hc, "SELECT x, y, z, LAG(z) OVER (PARTITION BY y ORDER BY x) FROM sdf") %>% 
  head()

##    x y          z        _c3
## 1  1 1 -0.6264538         NA
## 2  4 1  1.5952808 -0.6264538
## 3  7 1  0.4874291  1.5952808
## 4 10 1 -0.3053884  0.4874291
## 5  2 2  0.1836433         NA
## 6  5 2  0.3295078  0.1836433
Run Code Online (Sandbox Code Playgroud)

假设相应的PR将合并而没有重大更改窗口定义,示例查询应如下所示:

w <- Window.partitionBy("y") %>% orderBy("x")
select(sdf, over(lag(sdf$z), w))
Run Code Online (Sandbox Code Playgroud)