将 R 数据帧作为新的 table 推送到 SQL
Push an R dataframe to SQL as a new table
我正在努力使我的分析工作流程更高效,将我的 SQL 服务器数据库连接到 R-Studio。
我现在做什么?
- 我使用 MS SQL Management Studio 开发查询以提取相关信息进行分析。
- 我将查询结果导出到.csv UTF-8 文件。
- 我在 R-Studio 中读取文件并进行分析。
- 我将最终数据帧导出到 .csv UTF-8 文件。
- 我使用此文件在 SQL Management Studio 中创建了一个 table。
我想做什么?
我想在 SQL 服务器和 R-Studio 之间创建一个连接,这样我就可以直接 import/export 我的 dataframe/table 而无需在我的计算机中安装这些文件。
为此,我遵循了以下步骤:
- 在 R 中安装了 DBI 和 odbc 包。
- 使用"ODBC Data Source Connection Administrator"配置了连接
- 我的连接名称是 "Enterprise" (SQL Server Native Client 10.0)
- 在 R-Studio 中,使用“连接”选项卡,我可以看到包含 "Enterprise" 的数据源列表。
- 选择 "Enterprise" 数据源创建一个名为 "con" 的包含连接信息的 R 对象。
- 此时我可以在连接选项卡中看到所有数据库。
- 我在 R 中测试的代码如下:
---
title: "R Notebook"
output: html_notebook
---
```{r setup, include=FALSE}
library(odbc)
con <- dbConnect(odbc::odbc(), "Enterprise", timeout = 10) ```
```{sql, connection = con, output.var = "DataFrame"}
SELECT TOP 1000 *
FROM [DB].[dbo].[Table] ```
Data<-DataFrame[1:100,1:10]
head(Data,11)```
Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10
A 1 2.4 5.5 13.1 30.8 72.4 170.5 401.6 945.7
B 2 4.7 11.1 26.1 61.5 144.8 341.1 803.2 1891.5
C 3 7.1 16.6 39.2 92.3 217.3 511.6 1204.8 2837.2
D 4 9.4 22.2 52.2 123.0 289.7 682.2 1606.4 3782.9
E 5 11.8 27.7 65.3 153.8 362.1 852.7 2008.0 4728.6
F 6 14.1 33.3 78.4 184.5 434.5 1023.2 2409.6 5674.4
G 7 16.5 38.8 91.4 215.3 506.9 1193.8 2811.2 6620.1
H 8 18.8 44.4 104.5 246.0 579.4 1364.3 3212.8 7565.8
I 9 21.2 49.9 117.5 276.8 651.8 1534.9 3614.4 8511.5
J 10 23.5 55.5 130.6 307.5 724.2 1705.4 4016.0 9457.3
K 11 25.9 61.0 143.6 338.3 796.6 1875.9 4417.6 10403.0
```{sql, connection = con}
SELECT * INTO [DB].[dbo].[New_Table]
FROM ?Data```
这里我使用 ?
表示 "Data" 是 SQL 块中的 R 数据帧对象。
Error in vapply(values, function(x) { : values must be length 1,
but FUN(X[[1]]) result is length 100
Failed to execute SQL chunk
我猜我在最后一块做错了什么。
将 "Data" 推送到我的数据库的正确方法是什么?
我是怎么解决的?
在将数据框推送到数据库之前,我一直走在正确的轨道上。 @r2evans 指出,我试图从服务器创建一个 table,其中包含仅在本地存在的信息,代码如下:
```{sql, connection = con}
SELECT * INTO [DB].[dbo].[New_Table]
FROM ?Data```
在这一点上,我改变了方法并尝试使用 r-code 推送数据帧:
```{r}
dbWriteTable(con, "[DB].[dbo].[New_Table]", Data)```
结果出现以下错误:
nanodbc/nanodbc.cpp:1587: 42000: [Microsoft][SQL Server Native Client 10.0][SQL Server]CREATE TABLE permission denied in database 'master'.
这里的问题: 我试图访问我有权使用 "[DB].[dbo].[New_Table]"
的数据库。 dbWriteTable
函数将此参数理解为 table 的纯名称,因此我必须找到一种方法来指定数据库的正确路径。
没找到直接用代码实现的方法 解决方法:我去"ODBC Data Sources (32-bit)"
( Windows APP);并更改了我的连接配置。我的连接是将 master 作为默认数据库。我为我有权限的数据库更改了它。所以现在我使用以下代码从 R-notebooks 中推送 table:
```{r}
dbWriteTable(con, "[R_Test2]", Data, overwrite = T)```
它完美地满足了我的需要。
如果有人知道如何使用代码指定此路径,那将是一件好事。也许在第一个配置块中:
```{r setup, include=FALSE}
library(odbc)
library(DBI)
con <- dbConnect(odbc::odbc(), "Enterprise", timeout = 10)```
我正在努力使我的分析工作流程更高效,将我的 SQL 服务器数据库连接到 R-Studio。
我现在做什么?
- 我使用 MS SQL Management Studio 开发查询以提取相关信息进行分析。
- 我将查询结果导出到.csv UTF-8 文件。
- 我在 R-Studio 中读取文件并进行分析。
- 我将最终数据帧导出到 .csv UTF-8 文件。
- 我使用此文件在 SQL Management Studio 中创建了一个 table。
我想做什么?
我想在 SQL 服务器和 R-Studio 之间创建一个连接,这样我就可以直接 import/export 我的 dataframe/table 而无需在我的计算机中安装这些文件。
为此,我遵循了以下步骤:
- 在 R 中安装了 DBI 和 odbc 包。
- 使用"ODBC Data Source Connection Administrator"配置了连接
- 我的连接名称是 "Enterprise" (SQL Server Native Client 10.0)
- 在 R-Studio 中,使用“连接”选项卡,我可以看到包含 "Enterprise" 的数据源列表。
- 选择 "Enterprise" 数据源创建一个名为 "con" 的包含连接信息的 R 对象。
- 此时我可以在连接选项卡中看到所有数据库。
- 我在 R 中测试的代码如下:
---
title: "R Notebook"
output: html_notebook
---
```{r setup, include=FALSE}
library(odbc)
con <- dbConnect(odbc::odbc(), "Enterprise", timeout = 10) ```
```{sql, connection = con, output.var = "DataFrame"}
SELECT TOP 1000 *
FROM [DB].[dbo].[Table] ```
Data<-DataFrame[1:100,1:10]
head(Data,11)```
Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10
A 1 2.4 5.5 13.1 30.8 72.4 170.5 401.6 945.7
B 2 4.7 11.1 26.1 61.5 144.8 341.1 803.2 1891.5
C 3 7.1 16.6 39.2 92.3 217.3 511.6 1204.8 2837.2
D 4 9.4 22.2 52.2 123.0 289.7 682.2 1606.4 3782.9
E 5 11.8 27.7 65.3 153.8 362.1 852.7 2008.0 4728.6
F 6 14.1 33.3 78.4 184.5 434.5 1023.2 2409.6 5674.4
G 7 16.5 38.8 91.4 215.3 506.9 1193.8 2811.2 6620.1
H 8 18.8 44.4 104.5 246.0 579.4 1364.3 3212.8 7565.8
I 9 21.2 49.9 117.5 276.8 651.8 1534.9 3614.4 8511.5
J 10 23.5 55.5 130.6 307.5 724.2 1705.4 4016.0 9457.3
K 11 25.9 61.0 143.6 338.3 796.6 1875.9 4417.6 10403.0
```{sql, connection = con}
SELECT * INTO [DB].[dbo].[New_Table]
FROM ?Data```
这里我使用 ?
表示 "Data" 是 SQL 块中的 R 数据帧对象。
Error in vapply(values, function(x) { : values must be length 1,
but FUN(X[[1]]) result is length 100
Failed to execute SQL chunk
我猜我在最后一块做错了什么。
将 "Data" 推送到我的数据库的正确方法是什么?
我是怎么解决的?
在将数据框推送到数据库之前,我一直走在正确的轨道上。 @r2evans 指出,我试图从服务器创建一个 table,其中包含仅在本地存在的信息,代码如下:
```{sql, connection = con}
SELECT * INTO [DB].[dbo].[New_Table]
FROM ?Data```
在这一点上,我改变了方法并尝试使用 r-code 推送数据帧:
```{r}
dbWriteTable(con, "[DB].[dbo].[New_Table]", Data)```
结果出现以下错误:
nanodbc/nanodbc.cpp:1587: 42000: [Microsoft][SQL Server Native Client 10.0][SQL Server]CREATE TABLE permission denied in database 'master'.
这里的问题: 我试图访问我有权使用 "[DB].[dbo].[New_Table]"
的数据库。 dbWriteTable
函数将此参数理解为 table 的纯名称,因此我必须找到一种方法来指定数据库的正确路径。
没找到直接用代码实现的方法 解决方法:我去"ODBC Data Sources (32-bit)"
( Windows APP);并更改了我的连接配置。我的连接是将 master 作为默认数据库。我为我有权限的数据库更改了它。所以现在我使用以下代码从 R-notebooks 中推送 table:
```{r}
dbWriteTable(con, "[R_Test2]", Data, overwrite = T)```
它完美地满足了我的需要。
如果有人知道如何使用代码指定此路径,那将是一件好事。也许在第一个配置块中:
```{r setup, include=FALSE}
library(odbc)
library(DBI)
con <- dbConnect(odbc::odbc(), "Enterprise", timeout = 10)```