使用RODBC sqlSave从R向Teradata中的表写入数据帧

使用RODBC sqlSave从R向Teradata中的表写入数据帧,r,teradata,R,Teradata,这是一个运行数月的遗留R代码。我能够从R中读取/删除Teradata中的表,但无法从数据帧将数据写入表中 我尝试过删除表,重新创建和编写不同的数据帧 sqlSave(ch, df, tablename = paste("scenario.table_storetype"),rownames=F) 我得到了以下错误 sqlColumns(channel,tablename)[4L][,1L]中出错:错误的 维度回溯: 1.sqlSave(ch,df,tablename=paste(“scenar

这是一个运行数月的遗留R代码。我能够从R中读取/删除Teradata中的表,但无法从数据帧将数据写入表中

我尝试过删除表,重新创建和编写不同的数据帧

sqlSave(ch, df, tablename = paste("scenario.table_storetype"),rownames=F)
我得到了以下错误

sqlColumns(channel,tablename)[4L][,1L]中出错:错误的 维度回溯:
1.sqlSave(ch,df,tablename=paste(“scenario.table\u storetype”),.rownames=F,safer=FALSE,append=T)
2.sqlwrite(通道,表名,dat,verbose=verbose,fast=fast,.test=test,nastring=nastring)

输出: 结构(列表)(预测=c(36659805.7528117111.7527005618.75, 33650734.416666727243750.7526907919.0833333),实际=c(38293943, 2989214327016674335247247282725239926521098),BC=c(“准备好的沙拉、水果和蔬菜”, “熟食沙拉、水果和蔬菜”、“熟食沙拉、水果和蔬菜”, “熟食沙拉、水果和蔬菜”、“熟食沙拉、水果和蔬菜”, “准备好的沙拉、水果和蔬菜”,句号=201904:201909,how=c(“a_tslm_mape”, “a_tslm_mape”、“a_tslm_mape”、“a_tslm_mape”、“a_tslm_mape”、“a_tslm_mape” )),.Names=c(“预测”、“实际”、“BC”、“期间”、“如何”),row.Names=c(NA, 6L),class=“数据帧”)

四舍五入后-输出: 结构(列表)(预测=c(36659805.7528117111.7527005618.75, 33650734.4227243750.7526907919.08),实际=c(38293943, 2989214327016674335247247282725239926521098),BC=c(“准备好的沙拉、水果和蔬菜”, “熟食沙拉、水果和蔬菜”、“熟食沙拉、水果和蔬菜”, “熟食沙拉、水果和蔬菜”、“熟食沙拉、水果和蔬菜”, “准备好的沙拉、水果和蔬菜”,句号=201904:201909,how=c(“a_tslm_mape”, “a_tslm_mape”、“a_tslm_mape”、“a_tslm_mape”、“a_tslm_mape”、“a_tslm_mape” )),.Names=c(“预测”、“实际”、“BC”、“期间”、“如何”),row.Names=c(NA,
6L),class=“data.frame”)

显然,您有很多不同精度的数字。动态创建表格时,数字字段可能会映射为类型,其中比例2可以由第一个值设置,
36659805.75
,但这之后会与比例为7的
33650734.4166667
冲突

考虑使用的varTypes参数显式定义数据类型。根据文件:

varTypes:一个可选的命名字符向量,如果要创建一个表,它给出了用于某些(或全部)列的DBMS数据类型

此外,在R中进行相应的舍入,以符合Teradata列类型的精度要求

df$forecast <- round(df$forecast, 4)           # PRECISION OF 4

max(nchar(df$BC))                              # FIND MAX CHARS
max(nchar(df$how))                             # FIND MAX CHARS

tbl_types = c(forecast = "DECIMAL(12, 4)",
              actual = "DECIMAL(12, 4)",
              BC = "VARCHAR(50)",
              period = "INTEGER",
              how = "VARCHAR(20)")

sqlSave(ch, df, tablename = paste("scenario.table_storetype"), 
        varTypes = tbl_types, rownames = FALSE)

df$forecast您的df在列和行中有多大:
dim(df)
?尝试减少行数并进行测试。ODBC驱动程序可能会施加限制。@Parfait我尝试编写单行,但没有帮助。我可以使用sqlQuery命令手动插入一行,但sqlSave不起作用。您能回答我的第一个问题吗?通过减少行数,我的意思是保存前几行:
sqlSave(ch,head(df,10),tablename=paste(“scenario.table\u storetype”),rownames=F)
。您的问题可能是大小限制。@Parfait df的维度是[396,5],在data.frame-like列表中是否有嵌套对象?请发布
dput(head(df))
以便我们可以看到它的属性/维度。我尝试了舍入并将varTypes参数赋予sqlSave,但它没有帮助相同的确切错误?试试这个。在
sqlSave
中发送几列,查看哪个失败:
sqlSave(ch,df[c(“BC”,“how”),…)
(varchar字段),
sqlSave(ch,df[c(“period”),…)
(int字段),
sqlSave(ch,df[c(“预测”,“实际”),…)
(数字字段)。很抱歉@Parfait回复太晚。但似乎什么都不起作用
dput(head(df))
df$forecast <- round(df$forecast, 4)           # PRECISION OF 4

max(nchar(df$BC))                              # FIND MAX CHARS
max(nchar(df$how))                             # FIND MAX CHARS

tbl_types = c(forecast = "DECIMAL(12, 4)",
              actual = "DECIMAL(12, 4)",
              BC = "VARCHAR(50)",
              period = "INTEGER",
              how = "VARCHAR(20)")

sqlSave(ch, df, tablename = paste("scenario.table_storetype"), 
        varTypes = tbl_types, rownames = FALSE)