Самый быстрый способ загрузить данные хранилища SQL-данных databricks в tibble в RShiny, не блокируя основной поток?

1
6

Я работаю над приложением 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)
Аггей
Вопрос задан11 марта 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.