我正在使用亚马逊redshift和R.我得到了连接工作。我想创建一些数据库表并通过R将一些数据插入到它们中。但是,这样做时遇到了一些问题
# Set the Java Environment
# For 64 bit connections
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_121')
# For 32 bit connections
#Sys.setenv(JAVA_HOME='C:\\Program Files (x86)\\Java\\jre1.8.0_121')
# Load libraries if they haven't already
library(rJava)
library(RJDBC)
# Get the driver
jdbcDriver <- JDBC(driverClass="com.amazon.redshift.jdbc41.Driver",
classPath="drivers/RedshiftJDBC41-1.2.1.1001.jar")
# Connect to the database
jdbcConnection <- dbConnect(jdbcDriver,
"server",
"username", "password")
数据库已连接,没有问题。现在我想创建一个表并将数据插入其中。我使用sqlCreateTable
和sqlAppendTable
创建数据并将其插入表中。
# Create a table iris, and insert the data into it
sql_required <- sqlCreateTable(jdbcConnection, "iris_table1", iris)
tbl_create <- dbGetQuery(jdbcConnection, sql_required)
但是,上述命令会导致以下错误。
# Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ", :
# Unable to retrieve JDBC result set for CREATE TABLE "iris_table1" (
# "Sepal.Length" DOUBLE PRECISION,
# "Sepal.Width" DOUBLE PRECISION,
# "Petal.Length" DOUBLE PRECISION,
# "Petal.Width" DOUBLE PRECISION,
# "Species" VARCHAR(255)
# )
# ([JDBC Driver]com.amazon.dsi.dataengine.impl.DSISimpleRowCountResult
# cannot be cast to com.amazon.dsi.dataengine.interfaces.IResultSet)
尽管如此,该表已创建并将通过以下命令列出
sql_required <- "SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG=\'demodata\'"
tables_in_reshift <- dbGetQuery(jdbcConnection, sql_required)
tail(tables_in_reshift, 1)
# table_name
# 141 iris_table1
我甚至可以插入数据
sql_required <- sqlAppendTable(jdbcConnection, "iris_table1", head(iris))
tbl_insert <- dbGetQuery(jdbcConnection, sql_required)
但是,这也会导致以下错误。
# Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ", :
# Unable to retrieve JDBC result set for INSERT INTO "iris_table1"
# ("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
# VALUES
# (5.1, 3.5, 1.4, 0.2, 'setosa'),
# (4.9, 3, 1.4, 0.2, 'setosa'),
# (4.7, 3.2, 1.3, 0.2, 'setosa'),
# (4.6, 3.1, 1.5, 0.2, 'setosa'),
# (5, 3.6, 1.4, 0.2, 'setosa'),
# (5.4, 3.9, 1.7, 0.4, 'setosa')
# ([JDBC Driver]com.amazon.dsi.dataengine.impl.DSISimpleRowCountResult
# cannot be cast to com.amazon.dsi.dataengine.interfaces.IResultSet)
#
然而,将插入数据,因为以下命令返回6条记录
sql_required <- "SELECT * from iris_table1"
inserted_dat <- dbGetQuery(jdbcConnection, sql_required)
# sepal.length sepal.width petal.length petal.width species
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.6 3.1 1.5 0.2 setosa
# 3 5.4 3.9 1.7 0.4 setosa
# 4 5.1 3.5 1.4 0.2 setosa
# 5 4.7 3.2 1.3 0.2 setosa
# 6 5.0 3.6 1.4 0.2 setosa
虽然该程序有效,但我担心错误。 所以,我的问题是:
试图解释的错误是什么?如何摆脱它?
有没有更好的方法(更快,更有效)创建表并使用RJDBC
将数据插入红移?谢谢!
更新 我最初认为运行命令如
sqlCreateTable(jdbcConnection, "iris_table5", iris)
应该足以创建表,但它不会创建表
sqlAppendTable(jdbcConnection, "iris_table1", head(iris))
将数据附加到数据库表。
答案 0 :(得分:0)
以下两个命令:
sql_required <- sqlCreateTable(jdbcConnection, "iris_table1", iris)
tbl_create <- dbGetQuery(jdbcConnection, sql_required)
只需要第一次调用即可创建表。来自documentation for dbGetQuery():
此功能仅适用于SELECT查询。
但是你没有做一个选择,你正在创建一个表。您在此处调用数据也是如此:
sql_required <- sqlAppendTable(jdbcConnection, "iris_table1", head(iris))
因此,您应该删除对dbGetQuery()
的不必要的调用,这应该可以解决这些错误。
我不希望这是必要的,但您可能需要致电dbCommit()
来关闭交易:
dbCommit(jdbcConnection)
答案 1 :(得分:0)
我有同样的错误。如果您查看软件包说明文件,将会发现:
dbSendQuery
和dbSendUpdate
向数据库提交SQL查询。两者之间的区别仅在于dbSendUpdate
与DBML
查询一起使用,因此不返回任何结果集。
因此,对我来说,使用 dbSendUpdate
代替dbSendQuery
可以。
答案 2 :(得分:0)
我遇到了同样的错误。我在SQL工作台中运行查询。因此,R绝对不是问题。 看起来是redshift错误。我还更改了JDBC版本,但继续收到相同的错误。与使用相同JDBC版本的同事一起测试了该查询,该查询非常适合她。 我认为redshift中首选的语法是CTAS语句。相同查询的CTAS版本工作正常。我的解决方案是切换到CTAS语法。 https://docs.aws.amazon.com/redshift/latest/dg/r_CTAS_examples.html