#amazon-redshift
#amazon-redshift
Вопрос:
Раньше я рассматривал другие решения, но не мог найти проблему из объяснений. Я пытаюсь запустить скрипт python, в котором данные загружаются из базы данных MySQL oltp (AWS RDS) в базу данных olap на AWS Redshift. Я определил свою таблицу в Redshift, как показано ниже:
create_product = ("""CREATE TABLE IF NOT EXISTS product (
productCode varchar(15) NOT NULL PRIMARY KEY,
productName varchar(70) NOT NULL,
productLine varchar(50) NOT NULL,
productScale varchar(10) NOT NULL,
productVendor varchar(50) NOT NULL,
productDescription text NOT NULL,
buyPrice decimal(10,2) NOT NULL,
MSRP decimal(10,2) NOT NULL
)""")
Я использую скрипт python для загрузки данных из RDS в Redshift. Мое тело функции для загрузки
for query in dimension_etl_query:
oltp_cur.execute(query[0])
items = oltp_cur.fetchall()
try:
olap_cur.executemany(query[1], items)
olap_cnx.commit()
logger.info("Inserted data with: %s", query[1])
except sqlconnector.Error as err:
logger.error('Error %s Couldnt run query %s', err, query[1])
Запуск скрипта выдает ошибку
olap_cur.executemany(запрос [1], элементы) psycopg2.ошибки.StringDataRightTruncation: слишком длинное значение для изменения символа типа (256)Я проверил в своей базе данных SQL длину каждого столбца, и только ProductDescription имеет длину, превышающую 265 символов. Однако я использую текстовый тип данных в postgres для этого столбца. Был бы признателен за любые советы о том, как найти причину?
Ответ №1:
Смотрите здесь:
Типы текста и BPCHAR
Вы можете создать таблицу Amazon Redshift с текстовым столбцом, но она преобразуется в столбец VARCHAR (256), который принимает значения переменной длины, содержащие не более 256 символов.
Вы можете создать столбец Amazon Redshift с типом BPCHAR (символ с заполнением пробелом), который Amazon Redshift преобразует в столбец CHAR фиксированной длины (256).
Я думаю, вам может понадобиться VARCHAR
. По той же ссылке:
VARCHAR или ИЗМЕНЕНИЕ СИМВОЛА…
Если используется в выражении, размер выходных данных определяется с использованием входного выражения (до 65535).
Вам придется поэкспериментировать, чтобы убедиться, что это работает.
Комментарии:
1. Вы правы, я изменил ТЕКСТ на VARCHAR(500). Я думаю, что это отклонение в Redshift от Postgresql.
2. То есть в Postgres
text
имеетvarchar
неограниченную длину.
Ответ №2:
Просто постарайтесь, чтобы все было меньше 256 символов, даже если это text
Комментарии:
1. Насколько я понимаю, текст имеет неограниченную длину.
2. Я просто пытаюсь упростить для него 🙂