我正在尝试将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 repo上提出了这个问题,Hadley告诉我,这很可能是odbc
错误。当我在odbc
回购中raised问题时,Jim非常乐于助人,但无法解决问题。
要明确:
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
然而,凭借我的基础,我无法做到这一点。任何帮助都会很多赞赏。
答案 0 :(得分:1)
叹息。 (对任何遇到类似问题的人的答案。)
原来这是我尝试访问的特定表格的问题。
此表格可以很好地解决RODBC
和DBI/odbc
,但是只要我使用dplyr
就会出现此错误。
数据库中的其他表与dplyr
一起正常工作,因此必须与此特定表有关。更糟糕的是,我不知道为什么。
答案 1 :(得分:1)
我在Sybase中有一个非常相似的问题。原来,我的问题与odbc
或DBI
软件包完全无关。
对我来说,解决方案是确保我使用的是支持8字节SQLLEN数据类型的ODBC驱动程序。在Linux上,运行命令odbcinst -j
向我显示,对于在64位RHEL Server 7.5上运行的已安装unixODBC版本2.3.1,SQLLEN大小为8。
默认情况下,Sybase驱动程序被符号链接到4字节版本。按照下面的说明,我确保我已链接到8字节版本,并且我的问题已解决。奇怪的是,在通过isql
发出命令时,我从未遇到过这些问题,但是...也许这对于带有SQL Server的@robertmc来说是可行的。
也将其发布在相关的GitHub问题之一中: https://github.com/r-dbi/odbc/issues/174#issuecomment-403106647