Файл манифеста таблицы спектра, когда размер файла S3 указан в десятичном формате

Я читаю файл S3, создавая внешнюю таблицу Spectrum и указывая ее на файл манифеста, который содержит информацию об исходном файле S3. Проблема в том, что размер моего файла S3 указан в десятичном формате, например. 37,5 МБ или 100,2 КБ.

Согласно документации нам нужно указать размер файла в байтах. Теперь, когда я использую множитель 1000 для преобразования в байты, я теряю некоторые записи или некоторые данные в конце файла во внешней таблице. Но когда я использую множитель 1024 для преобразования в байты, размер конвертированного файла будет десятичным.

Предположим, у меня размер файла 100,2 КБ, поэтому в байтах это будет 102604,8 байт.

  1. Когда я указываю размер файла как 102604,8 в файле манифеста, я получаю сообщение об ошибке «В записи файла не задана длина содержимого».
  2. Когда я предоставляю округленное значение для следующего целого числа, 102605, я получаю сообщение об ошибке «Ошибка спектра».
  3. Когда я предоставляю округленное значение для предыдущего целого числа, 102604, я снова получаю ту же ошибку «Ошибка спектра».

Мой манифест выглядит так:

{

  "entries": [

    {"url":"s3://path/filename1.csv", "meta": { "content_length": 102605 } },

    {"url":"s3://path/filename2.csv", "meta": { "content_length": 102605 } }

  ]

}

Кто-нибудь здесь сталкивался с таким сценарием и может поделиться своими впечатлениями.


person SwapSays    schedule 16.04.2020    source источник


Ответы (1)


И какой реальный размер файла?

Предположим, у меня размер файла 100,2 КБ, поэтому в байтах это будет 102604,8 байт.

Значение 100.2 KB не является точным размером файла в байтах. Ваш файл всегда будет иметь полное количество байтов (поскольку данные хранятся в байтах в памяти).

Вы можете проверить размер файла, скопировав его на локальный компьютер и вызвав

stat -f%z my_file.csv

Также вы можете напрямую проверить метаданные объекта s3, например. авс кли

aws s3api head-object --bucket my_bucket --key my_objects_key --query 'ContentLength' 

В нашей системе мы используем последний (но с использованием библиотеки Python boto3) для сборки файла манифеста, и он работает без проблем.

Для отладки вы также можете заглянуть в некоторые внутренние таблицы Redshift, такие как STL_ERROR. или SVL_S3LOG.

person botchniaque    schedule 17.06.2020
comment
Спасибо @bochniaque Поскольку я смотрел только на размер ведра S3, я столкнулся с этой проблемой. Я пробовал как свойства файла Windows, так и команду cli, чтобы получить точный размер, и теперь он работает нормально. - person SwapSays; 07.07.2020