Это мой код. Я запускаю его в databricks.
library(sparklyr)
library(dplyr)
library(arrow)
sc <- spark_connect(method = "databricks")
tbl_change_db(sc, "prod")
trip_ids <- spark_read_table(sc, "signals",memory=F) %>%
slice_sample(10) %>%
pull(trip_identifier)
Код очень медленный, и его выполнение занимает час, хотя я запрашиваю только 10 образцов. Почему это? Есть ли способ улучшить производительность?
Спасибо!





Похоже, вы используете функцию dplyrslice_sample для выборки набора данных, а затем выбираете оттуда какой-то один столбец. Проблема в том, что движок Spark не знает об этом: ваша выборка происходит в R. Это означает, что полный набор данных полностью считывается из любого места, где он хранится, и полностью отправляется в ваш движок R, чтобы там только выполнять подвыборку.
Что вам нужно сделать, так это получить подмножество и столбец в самом Spark. Вы можете сделать это с помощью функций select (для захвата одного столбца) и head (для захвата N строк):
trip_ids <- head(select(spark_read_table(sc, "signals",memory=F), trip_identifier), 10L)
В другом ответе и комментарии уже говорилось, почему запрос занимал так много времени (вы загружали всю таблицу в драйвер/R раньше, чем хотели), но я хотел включить пример, который действительно отбирает данные, и другой подход, который дает у вас больше контроля (например, тот, который использует SparkSQL). При работе со Spark я стараюсь выполнять всю свою тяжелую работу в виде реальных SQL-запросов, поэтому я бы предпочел вариант 2, но я включил оба варианта на тот случай, если один окажется более полезным, чем другой.
library(sparklyr)
library(dplyr)
sc = spark_connect(method = "databricks")
tbl_change_db(sc, "prod")
# Option 1, using a fraction (proportion in this case) to pull a random sample
spark_read_table(sc, "signals", memory = FALSE) %>%
select(trip_identifier) %>%
sdf_sample(fraction = .0001, replacement = FALSE, seed = NULL) %>%
collect() %>% #this is not necessary, but it makes the pull-down to R explicit
pull(trip_identifier)
# Option 2, using SparkSQL to run the query as you intended (sampling 10 rows)
sc %>%
sdf_sql("SELECT trip_identifier FROM signals TABLESAMPLE (10 ROWS)") %>%
collect() %>% #this is not necessary, but it makes the pull-down to R explicit
pull(trip_identifier)
Как этот пример
trip_ids <- spark_tbl(sc, "prod.signals") %>%
sample_n(10) %>%
pull(trip_identifier)
Я надеюсь, что это должно быть полезно
искра способна подавлять преобразования, о которых знает ее каталитический двигатель. Он не знает ни о чем определенном вне искры. Это черный ящик, поэтому оптимизация невозможна. Вот кое-что по этому поводу.