Я работаю над приложением RShiny, которое получает данные из хранилища SQL databricks, когда пользователь нажимает кнопку.
В некэшированной ситуации с использованием DBI получение данных занимает около 40 секунд (без проблем).
Однако, когда данные кэшируются в хранилище SQL databricks: данные отправляются databricks за 2 секунды, но все равно обрабатываются в data.frame (как это делает DBI) всего через 40 секунд. Проблема, похоже, заключается в преобразовании формата.
Я пришел к выводу, что проблема в форматировании при использовании Python: Если я выполняю простой cursor.execute
в Python:
Самый быстрый способ, который я нашел, чтобы поместить данные в tibble, — это использовать reticulate & polars для получения данных (10 секунд для кэшированных результатов).
Однако использование reticulate блокирует поток R, поэтому никакие другие пользователи не получают помощи, ожидая завершения функции:
result <- py$get_databricks_data(query) %>% as_tibble()
До этого я пробовал использовать R DBI, который был медленным (40 секунд для кэшированных результатов, как я видел). Он использовал драйвер DatabricksJDBC42.jar
.
Я также пытался запустить функцию reticulate, которая использовала функцию polars в future_promise
. Однако с несколькими планами:
Мне кажется немного излишним порождать рой Kubernetes и перенаправлять каждого пользователя в его собственный контейнер/pod.
def get_databricks_data(
query: str, databricks_access_token: str
) -> pl.DataFrame:
"""Use polars to read data as it turns it into a tibble faster than DBI."""
with sql.connect(
server_hostname="",
http_path="",
access_token=databricks_access_token,
) as connection:
data = pl.read_database(query, connection)
return data
jdbc_url <- paste0(
"jdbc:databricks://",
config$DATABRICKS$SERVER_HOSTNAME,
":443/default;transportMode=http;ssl=1;AuthMech=3;httpPath=",
config$DATABRICKS$HTTP_PATH,
";UID=",
config$DATABRICKS$TOKEN,
";PWD=",
config$DATABRICKS$TOKEN
)
databricks_con <- dbConnect(drv, jdbc_url, user = "token")
}
data <- DBI::dbGetQuery(databricks_con, query)