ошибка postgresql (aws redshift) 1204 Длина строки превышает длину DDL - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь импортировать csv в красное смещение aws (postgresql 8.x).

Поток данных: mysql -> паркетные файлы на s3 -> csv файлы на s3 -> красное смещение.

Структура стола

MySQL таблица SQL:

create table orderitems
(
  id                         char(36) collate utf8_bin not null
    primary key,
  store_id                   char(36) collate utf8_bin not null,
  ref_type                   int                       not null,
  ref_id                     char(36) collate utf8_bin not null,
  store_product_id           char(36) collate utf8_bin not null,
  product_id                 char(36) collate utf8_bin not null,
  product_name               varchar(50)               null,
  main_image                 varchar(200)              null,
  price                      int                       not null,
  count                      int                       not null,
  logistics_type             int                       not null,
  time_create                bigint                    not null,
  time_update                bigint                    not null,
  ...
);

Я использовал тот же sql для создания таблицы в красном смещении, но при импорте csv произошла ошибка.

Мой код импортирует csv в красное смещение (python)

# parquet is dumpy by sqoop
p2 = 'xxx'
df = pd.read_parquet(path)    

with smart_open.smart_open(p2, 'w') as f:
    df.to_csv(f, index=False)  # python3 default encoding is utf-8

conn = psycopg2.connect(CONN_STRING)

sql="""COPY %s FROM '%s' credentials 'aws_iam_role=%s' region 'cn-north-1' 
delimiter ',' FORMAT AS CSV IGNOREHEADER 1 ; commit ;""" %  (to_table, p2, AWS_IAM_ROLE)
print(sql)
cur = conn.cursor()
cur.execute(sql)
conn.close()

Ошибка

При проверке STL_LOAD_ERRORS обнаружена ошибка в столбце product_name enter image description here

  • row_field_value: ............................................. 215 г / ...
  • код ошибки: 1204
  • err_reason: длина строки превышает длину DDL

Реальное_значение 伊利畅轻蔓越莓奇亚籽风味发酵乳215g/瓶 (китайский).

Так что это похоже на проблему кодирования. Поскольку mysql - это utf-8, а csv - тоже utf-8, я не знаю, что не так.

1 Ответ

0 голосов
/ 09 января 2019

Ваш столбец имеет тип данных varchar длиной 50. Это 50 байт , а не 50 символов . Пример строки, который вы дали, выглядит примерно из 16 китайских символов, которые, вероятно, составляют 3 байта каждый (UTF-8) и четыре символа ASCII (по одному байту каждый), то есть около 52 байтов. Это больше, чем длина байта столбца, поэтому импорт не выполняется.

...