这是一个运行了几个月的旧版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_storetype”),。rownames = F,更安全= FALSE,append = T)
2. sqlwrite(channel,tablename,dat,verbose = verbose,fast = fast,。test = test,nastring = nastring)
dput(head(df))
输出: 结构(列表(预测= c(36659805.75,28117111.75,27005618.75, 33650734.4166667、27243750.75、26907919.0833333),实际= c(38293943, 29892143、27016674、33524728、27252399、26521098),BC = c(“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”,“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”,“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”),期间= 201904:201909,方式= c(“ a_tslm_mape”, “ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape” ))。.names = c(“ forecast”,“ actual”,“ BC”,“ period”,“ how”),row.names = c(NA, 6L),类=“ data.frame”)
dput(head(df))
四舍五入后-输出: 结构(列表(预测= c(36659805.75,28117111.75,27005618.75, 33650734.42、27243750.75、26907919.08),实际= c(38293943, 29892143、27016674、33524728、27252399、26521098),BC = c(“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”,“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”,“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”),期间= 201904:201909,方式= c(“ a_tslm_mape”, “ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape” ))。.names = c(“ forecast”,“ actual”,“ BC”,“ period”,“ how”),row.names = c(NA, 6L),类=“ data.frame”)
答案 0 :(得分:0)
显然,您有非常大的数字,且精度不同。动态创建表时,数字字段可能会映射为DECIMAL(n, m)
类型,其中第2个小数位数可能由第一个值36659805.75
设置,但后来与33650734.4166667
的小数位数冲突7。
考虑使用sqlSave
的 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)