我正在将sparklyr
与dplyr
一起使用,以读取大小比可用RAM大得多的数据。因此,我没有将数据加载到内存中。
dat_tbl <- spark_read_parquet(sc, name = "dat", path = path, memory = FALSE)
当我尝试以以下方式过滤(循环中的数据,说i = 1
)时,它失败
var_name <- unique_values$Species[1]
res <- dat_tbl %>%
filter(Species == unique_values$Species[1])
res
UseMethod(“ escape”)中的错误: 没有适用于“ c('tbl_df','tbl','data.frame')”类的对象的'escape'适用方法
但是,以下成功!
var_name <- unique_values$name[1]
res <- dat_tbl %>%
filter(Species == var_name)
我想知道为什么!?
编辑
这是一个可复制的小例子。
library(sparklyr)
library(dplyr)
# setting up
sc <- spark_connect(master = "local")
iris_tbl <- copy_to(sc, iris)
spark_write_parquet(iris_tbl, "temp")
tbl <- spark_read_parquet(sc, "data", "temp")
unique_values <- tbl %>% distinct(Species) %>% collect
unique_values$Species[1]
#[1] "versicolor"
class(unique_values$Species[1])
#[1] "character"
res <- tbl %>% filter(Species == unique_values$Species[1] )
res
# Error in UseMethod("escape") :
# no applicable method for 'escape' applied to an object of
# class "c('tbl_df', 'tbl', 'data.frame')"
var_name <- unique_values$Species[1]
res <- tbl %>% filter(Species == var_name)
res
# # Source: spark<?> [?? x 5]
# Sepal_Length Sepal_Width Petal_Length Petal_Width Species
# <dbl> <dbl> <dbl> <dbl> <chr>
# 1 7 3.2 4.7 1.4 versicolor
# 2 6.4 3.2 4.5 1.5 versicolor
# 3 6.9 3.1 4.9 1.5 versicolor
# 4 5.5 2.3 4 1.3 versicolor
# 5 6.5 2.8 4.6 1.5 versicolor
答案 0 :(得分:0)
尽管这不是一个完整的答案,但是在将dplyr
表达式转换为SQL
时出现了问题。
失败
tbl %>% filter(Species == unique_values$Species[1] ) %>% show_query()
#<SQL>
UseMethod(“ escape”)中的错误: 没有适用于“ c('tbl_df','tbl','data.frame')”类的对象的'escape'适用方法
工程
var_name <- unique_values$Species[1]
tbl %>% filter(Species == var_name) %>% show_query()
#<SQL>
#SELECT *
#FROM `data`
#WHERE (`Species` = "versicolor")