Записать фрейм данных в таблицу в Teradata из R с помощью RODBC sqlSave - PullRequest
1 голос
/ 13 июня 2019

Это устаревший код R, который работает месяцами.Я смог прочитать / удалить таблицу в Teradata из R, но не смог записать данные в таблицу из фрейма данных.

Я пытался сбросить таблицу, воссоздать и записать другой фрейм данных.

sqlSave(ch, df, tablename = paste("scenario.table_storetype"),rownames=F)

Я получил следующую ошибку

Ошибка в sqlColumns (канал, имя таблицы) [4L] [, 1L]: неверное количество измерений.1. sqlSave (ch, df, tablename = paste ("scene.table_storetype"),. Rownames = F, более безопасный = FALSE, append = T)2. sqlwrite (канал, имя таблицы, dat, подробный = подробный, быстрый = быстрый,. 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 = cd, "Prepa" Prepa "Prepa" Prepa "Prepa" PrepaСалат "Фрукты и овощи", "Готовый салат, фрукты и овощи", "Готовый салат, фрукты и овощи", "Готовый салат, фрукты и овощи", "Готовый салат, фрукты и овощи"), период = 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", "period", "как"), row.names = c (NA, 6L), class = "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 ")," a_tslm_mape "),."прогноз", "факт", "BC", "период", "как"), row.names = c (NA, 6L), класс = "data.frame")

1 Ответ

0 голосов
/ 25 июня 2019

Очевидно, у вас есть очень большие числа с различной степенью точности.При динамическом создании таблицы числовые поля могут отображаться как DECIMAL(n, m) типа, где масштаб 2 может быть установлен по первому значению, 36659805.75, но позже это конфликтует с 33650734.4166667 с масштабом7.

Попробуйте использовать аргумент varTypes , равный sqlSave, для явного определения типов данных.Согласно документам:

varTypes: необязательный именованный символьный вектор, дающий типы данных СУБД, которые будут использоваться для некоторых (или всех) столбцов при создании таблицы

Кроме того, округлите соответственно в 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)
...