Фильтрация искровой тбл в петле - PullRequest
1 голос
/ 06 июня 2019

Я использую 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

1 Ответ

0 голосов
/ 12 июня 2019

Хотя это не полный ответ, проблема возникает при переводе выражения dplyr в SQL.

Сбои

tbl %>% filter(Species ==  unique_values$Species[1] ) %>% show_query()

#<SQL>

Ошибка в UseMethod («escape»): нет применимого метода для «escape», примененного к объекту класса «c ('tbl_df', 'tbl', 'data.frame') "

Работы

var_name <- unique_values$Species[1]
tbl %>% filter(Species ==  var_name) %>% show_query()
#<SQL>
#SELECT *
#FROM `data`
#WHERE (`Species` = "versicolor")
...