Подключитесь к базе данных Microsoft SQL с помощью dplyr 0.7 и R

Я пытаюсь использовать dplyr / dbplyr (version 0.7) с базой данных (Microsoft SQL Server 2014). Я смог подключиться к этому и извлечь данные, используя RODBC, DBI а также odbc пакеты. Проблема возникает, когда я пытаюсь использовать глаголы dplyr непосредственно с основанием.

Когда я пытаюсь использовать dplyr Я получаю следующую ошибку:

Error in new_result(connection@ptr, statement) : std::bad_alloc

Я поднял это на репо dplyr, где Хэдли сказал мне, что это, скорее всего, odbc ошибка. Джим был очень полезным, когда я поднял вопрос о odbc репо, но не смог решить проблему.

Чтобы было ясно:

RODBC::sqlQuery() а также DBI::dbGetQuery() оба работают: я получаю данные обратно, как я ожидал, и я могу использовать SQL просит вернуть все, что я хочу. Я только сталкиваюсь с ошибкой выделения памяти при попытке использовать dplyr глаголы (на самом деле, даже когда я пытаюсь tbl()). Существует много данных, но я запрашиваю их подмножество, и они удобно помещаются в R-память.

В идеале, я бы предпочел полностью исключить данные из памяти R, если это возможно. Причина в том, что я строю Shiny приложение, которое будет создавать графики и т.д. на основе аспектов данных, которые выбирает пользователь. Как вы можете себе представить, подключение к базе данных, отправка запросов и получение данных каждый раз, когда пользователь делает это, делает приложение несколько бесполезным, потому что оно очень медленное. Моя идеальная ситуация похожа на RStudio пример:

my_db <- src_mysql(
  dbname = "shinydemo",
  host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
  user = "guest",
  password = "guest"
)

> my_db %>% tbl("City") %>% head(5)
# Source:   lazy query [?? x 5]
# Database: mysql 10.0.17-MariaDB [guest@shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com:/shinydemo]
     ID           Name CountryCode      District Population
  <dbl>          <chr>       <chr>         <chr>      <dbl>
1     1          Kabul         AFG         Kabol    1780000
2     2       Qandahar         AFG      Qandahar     237500
3     3          Herat         AFG         Herat     186800
4     4 Mazar-e-Sharif         AFG         Balkh     127800
5     5      Amsterdam         NLD Noord-Holland     731200

Однако с моей базой я не могу этого сделать. Любая помощь будет высоко ценится.

2 ответа

Решение

Вздох. (Ответьте за любого, кто сталкивается с чем-то подобным.)

Оказывается, это проблема с конкретной таблицей, к которой я пытаюсь получить доступ.

Эта таблица возвращается без проблем с RODBC а также DBI/odbc, но как только я использую dplyr это выплевывает эту ошибку.

Другие таблицы в базе данных отлично работают с dplyr, так что это должно быть что-то делать с этой конкретной таблицей. Хуже, я понятия не имею, почему.

У меня была очень похожая проблема с Sybase. Моя проблема оказалась совершенно не связана с odbc или же DBI пакеты.

Решением для меня было убедиться, что я использовал драйвер ODBC, который поддерживает 8-байтовый тип данных SQLLEN. В Linux работает команда odbcinst -j показал, что размер SQLLEN был равен 8 для моей установленной unixODBC версии 2.3.1, работающей на 64-битной RHEL Server 7.5.

По умолчанию драйвер Sybase был связан с 4-байтовой версией. Следуя приведенным ниже инструкциям, я убедился, что я ссылаюсь на 8-байтовую версию, и мои проблемы были решены. Как ни странно, я никогда не сталкивался с этими проблемами при выдаче команд через isql но... Возможно, это будет работать для @robertmc с SQL Server.

http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc20155.1600/doc/html/san1361915533650.html

Опубликовал это также в одной из проблем GitHub: https://github.com/r-dbi/odbc/issues/174

Другие вопросы по тегам