SparkR window 函数
SparkR window function
我从JIRA中发现,SparkR
的1.6版本实现了window功能,包括lag
和rank
,但是over
功能尚未实施。我如何在 SparkR
中使用 window 函数,如 lag
函数而不使用 over
(不是 SparkSQL
方式)?有人可以举个例子吗?
Spark 2.0.0+
SparkR 为 DSL 包装器提供 over
、window.partitionBy
/ partitionBy
、window.orderBy
/ orderBy
和 rowsBetween
/ rangeBeteen
函数。
火花 <= 1.6
很遗憾,在 1.6.0 中是不可能的。虽然一些 window 函数(包括 lag
)已经实现,但 SparkR 不支持 window 定义,这使得这些定义完全无用。
只要 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
假设 corresponding PR 将在没有重大更改的情况下合并 window 定义和示例查询应如下所示:
w <- Window.partitionBy("y") %>% orderBy("x")
select(sdf, over(lag(sdf$z), w))
我从JIRA中发现,SparkR
的1.6版本实现了window功能,包括lag
和rank
,但是over
功能尚未实施。我如何在 SparkR
中使用 window 函数,如 lag
函数而不使用 over
(不是 SparkSQL
方式)?有人可以举个例子吗?
Spark 2.0.0+
SparkR 为 DSL 包装器提供 over
、window.partitionBy
/ partitionBy
、window.orderBy
/ orderBy
和 rowsBetween
/ rangeBeteen
函数。
火花 <= 1.6
很遗憾,在 1.6.0 中是不可能的。虽然一些 window 函数(包括 lag
)已经实现,但 SparkR 不支持 window 定义,这使得这些定义完全无用。
只要 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
假设 corresponding PR 将在没有重大更改的情况下合并 window 定义和示例查询应如下所示:
w <- Window.partitionBy("y") %>% orderBy("x")
select(sdf, over(lag(sdf$z), w))