用于spark SQL的SparklyR包装器:sqlContext.sql

时间:2017-03-09 16:30:45

标签: r apache-spark apache-spark-sql sparklyr r-dbi

我正在尝试为SparklyR编写SQL函数的包装器。我创建了以下函数:

SELECT COUNT(ID) FROM wp_posts WHERE wp_posts.post_date >= '2016-09-09 15:19:39' AND wp_posts.post_date <= '2017-03-09 16:19:39' AND wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish'

然后我使用以下方法调用它:

sqlfunction <- function(sc, block) {
  spark_context(sc) %>% 
invoke("sqlContext.sql", block) }

但是我收到以下错误:

newsqlData <- sqlfunction(sc, "select
                          substr(V1,1,2),
                          substr(V1,3,3),
                          substr(V1,6,6),
                          substr(V1,12,4),
                          substr(V1,16,4)
                          FROM TABLE1 WHERE V1 IS NOT NULL")

任何建议或修正都将不胜感激。

1 个答案:

答案 0 :(得分:6)

应该是:

sqlfunction <- function(sc, block) {
  spark_session(sc) %>% invoke("sql", block)
}

其中scspark_connection(来自:spark_connect(master = master_url)的输出)。

此:

  • spark_session(sc) - 从连接对象中检索SparkSession
  • invoke("sql", block) - 使用sql作为参数调用SparkSession实例的block方法。

示例用法:

library(sparklyr)

sc <- spark_connect(master = "local[*]")
sqlfunction(sc, "SELECT SPLIT('foo,bar', ',')")
<jobj[11]>
  class org.apache.spark.sql.Dataset
  [split(foo,bar, ,): array<string>]

这将为您提供Java对象的引用。如果你想要,你可以将例如register作为临时表:

... %>% invoke("createOrReplaceTempView", "some_name_for_the_view")

并使用tbl访问:

library(dplyr)

tbl(sc, "some_name_for_the_view") 

... %>% sdf_register()

直接获取tbl_spark对象。

您使用的代码:

  • spark_context - 提取SparkContext个实例。
  • invoke("sqlContext.sql", block) - 尝试调用不存在的方法(sqlContext.sql)。

在最新版本中,您可以使用简单invoke("createOrReplaceTempView", ...)替换sdf_register