我正在尝试为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")
任何建议或修正都将不胜感激。
答案 0 :(得分:6)
应该是:
sqlfunction <- function(sc, block) {
spark_session(sc) %>% invoke("sql", block)
}
其中sc
为spark_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
。