SparkR窗口功能

时间:2016-01-19 20:06:24

标签: r apache-spark apache-spark-sql window-functions sparkr

我从JIRA发现SparkR的1.6版已经实现了包含lagrank的窗函数,但over函数尚未实现。如何在lag(而不是over方式)中使用SparkR函数之类的窗口函数而不使用SparkSQL?有人可以提供一个例子吗?

1 个答案:

答案 0 :(得分:6)

Spark 2.0.0 +

SparkR通过partitionBywindow.orderBy / orderByrowsBetween / rangeBeteenlag / 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 函数提供DSL包装器

Spark&lt; = 1.6

不幸的是,在1.6.0中是不可能的。虽然已经实现了一些窗口函数,包括w <- Window.partitionBy("y") %>% orderBy("x") select(sdf, over(lag(sdf$z), w)) ,但SparkR并不支持窗口定义,这使得这些函数完全无用。

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

try (Connection connection = driver.connect(connectionUrl,
                connectionProperties);
                ResultSet resultSet = connection.getMetaData().getSchemas()) {
            ImmutableSet.Builder<String> schemaNames = ImmutableSet.builder();
            while (resultSet.next()) {
                String schemaName = resultSet.getString(1).toLowerCase();
                log.info("Listing schemas: " + schemaName);
                schemaNames.add(schemaName);
            }
            return schemaNames.build();
        } catch (SQLException e) {
            throw Throwables.propagate(e);
}

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

campaign = models.ForeignKey('appname.Campaign', verbose_name="Кампания")