Я использую sparklyr
с dplyr
для чтения данных, размер которых намного больше доступной оперативной памяти.Итак, я не загружал данные в память.
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»): нет применимого метода для escape, примененного к объекту класса «c» («tbl_df», «tbl», «data»).frame ') "
Однако, следующее успешно выполнено!
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