Управляйте Spark DataFrame с использованием синтаксиса SQL и сохраняйте результат обратно в кластер - PullRequest
1 голос
/ 31 марта 2020

Я использую RStudio Server, работающий в кластере Databricks. Один из способов использования синтаксиса SQL для управления кадрами данных в кластере - использование пакета DBI. Например,

library(DBI)
df <- dbGetQuery(sc, "select * from table_on_cluster")

Однако это сохраняет результат как объект R (df). Я хотел бы продолжать работать против кластера (через sparklyr). Вместо того, чтобы выполнить дополнительный шаг, чтобы записать это обратно в кластер, как показано ниже, есть ли способ, которым я мог бы сделать это за один шаг?

tbl_df <- copy_to(sc, df)

Т.е. я хотел бы, чтобы результат синтаксиса SQL был записан в кластере. Вышеописанное болезненно, потому что copy_to очень медленный, особенно для больших данных.

1 Ответ

0 голосов
/ 05 апреля 2020

Если таблица уже зарегистрирована в кластере, вам нужно только использовать функцию dplyr::tbl для создания объекта tbl_df.

tbl_df <- tbl(sc,"table_on_cluster")

Затем вы можете использовать интерфейс dplyr для управления фреймом Spark Data.

Вот полный пример с использованием iris данных.

library(sparklyr)
library(dplyr)

sc <- sparklyr::spark_connect(master = "local")

# Let's suppose iris is your table
sdf_copy_to(sc, iris, name = "table_on_cluster")
src_tbls(sc)

tbl_df <- tbl(sc,"table_on_cluster")

tbl_df %>%
  filter(Species == "versicolor") %>%
  head(3)

Результат:

# 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
...