R JDBC在amazon红移中创建表和插入时出错

R JDBC在amazon红移中创建表和插入时出错,r,amazon-redshift,rjdbc,R,Amazon Redshift,Rjdbc,我使用亚马逊红移与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)\\J

我使用亚马逊红移与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")
但是,上述命令会导致以下错误

# 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)
# 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)
# 
但是,该表将被创建,并将通过以下命令列出

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
然而,数据将被插入,因为下面的命令返回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
应该足以创建表,但它不会创建表,也不会创建表

sqlAppendTable(jdbcConnection, "iris_table1", head(iris))

将数据追加到数据库表中

以下两个命令中的:

sql_required <- sqlCreateTable(jdbcConnection, "iris_table1", iris)
tbl_create <-  dbGetQuery(jdbcConnection, sql_required)

我也犯了同样的错误。如果查看软件包文档,您会发现:

dbSendQuery和dbSendUpdate向数据库提交SQL查询。两者之间的区别只是dbSendUpdate与DBML查询一起使用,因此不会返回任何结果集


因此,使用dbSendUpdate而不是dbSendQuery对我来说很有效。

我也遇到了同样的错误。我在SQL workbench中运行查询。所以这绝对不是R的问题。 看起来像是红移错误。我还更改了JDBC版本,但仍然得到相同的错误。与使用同一JDBC版本的同事一起测试了该查询,结果对她非常有效。 我认为红移中首选的语法是CTAS语句。同一查询的CTAS版本运行良好。我的解决方案是切换到CTAS语法。

谢谢!我也有同样的观点,我一开始也尝试过,但这些并没有创建一个表,也没有附加数据。我已经更新了这个问题来澄清这一点。@discipulus从我读到的内容来看,这应该是没有必要的。听起来好像没有提交事务。您可以在DML语句之后尝试使用dbCommit。有趣的是!这没用。dbCommitjdbcConnection返回true,但当我运行query:inserted_dat时,我认为您遇到的是Redshift问题,而不是R。您应该检查Redshift的文档。如果关闭R会话,下次检查时数据是否显示在表中?
sqlCreateTable(jdbcConnection, "iris_table5", iris)
sqlAppendTable(jdbcConnection, "iris_table1", head(iris))
sql_required <- sqlCreateTable(jdbcConnection, "iris_table1", iris)
tbl_create <-  dbGetQuery(jdbcConnection, sql_required)
sql_required <- sqlAppendTable(jdbcConnection, "iris_table1", head(iris))
dbCommit(jdbcConnection)