Подключитесь к базе данных 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.
Опубликовал это также в одной из проблем GitHub: https://github.com/r-dbi/odbc/issues/174