Amazon S3 Select From не работает

Amazon S3 имеет новую функцию под названием select from который позволяет выполнять простые запросы SQL к простым файлам данных - таким как CSV или JSON. Так что я решил попробовать.

Я создал и загрузил следующий CSV в мое хранилище S3 в Орегоне (я считаю этот файл очень простым):

aaa,bbb,ccc
111,111,111
222,222,222
333,333,333

Я указал, что это CSV со строкой заголовка и выпустил следующий SQL:

выберите * из s3object s

... который работал как положено, возвращая:

111,111,111
222,222,222
333,333,333

Затем я попробовал один из предоставленных примеров запросов, который не удался:

select s._1, s._2 from s3object s

... сообщение об ошибке "Некоторые заголовки в запросе отсутствуют в файле. Пожалуйста, проверьте файл и попробуйте снова."

Также пробовал следующее, каждый раз получая одну и ту же ошибку:

select aaa from s3object s
select s.aaa from s3object s
select * from s3object s where aaa = 111
select * from s3object s where s.aaa = 111
select * from s3object s where s._1 = 111

Поэтому всякий раз, когда мой запрос ссылается на столбец, по имени или номеру, в предложениях SELECT или WHERE, я получаю "заголовки в запросе отсутствуют". Документация AWS не содержит никакой последующей информации об этой ошибке.

Итак, мой вопрос, что не так? Есть ли недокументированное требование к заголовкам столбцов? Есть ли недокументированный способ ссылки на столбцы? Есть ли в функции "Выбрать из" ошибка?

4 ответа

Я сделал следующее:

  • Создан файл с содержимым, которое вы показываете выше
  • Введено S3 Выберите файл, и отметка Файл имеет строку заголовка
  • Не изменилось никаких других настроек

Эти запросы НЕ работали:

select s._1, s._2 from s3object s
select * from s3object s where s._1 = 111

Причина, по которой они не работают, заключается в том, что файл содержит заголовки, поэтому столбцы имеют действительные имена.

Эти запросы работали:

select aaa from s3object s
select s.aaa from s3object s
select * from s3object s where aaa = 111 (Gave empty result)
select * from s3object s where s.aaa = 111 (Gave empty result)

Когда я обработал последние два запроса как строки, они вернули строку, как и ожидалось:

select * from s3object s where aaa = '111'
select * from s3object s where s.aaa = '111'

Возвращаясь к этому, по какой-то причине я решил заменить этот файл примера новым идентичным файлом примера, и теперь я не сталкиваюсь с проблемой. На самом деле, я не могу воспроизвести проблему, которую я первоначально разместил.

У меня есть несколько теорий: кодировка символов, символ конца строки и возможное присутствие дополнительной строки в моем исходном файле, но я не смог воссоздать исходную проблему.

Я пробовал разные редакторы для создания исходного файла, я пробовал символы конца строки в Unix и Windows, я пробовал дополнительную строку в конце, я пробовал прописные и строчные заголовки столбцов, и я пробовал разные регионы. Теперь все работает, поэтому я совершенно не понимаю, почему это не сработало.

Жизнь идет. Спасибо всем за ваши усилия.

У меня недостаточно представителей, чтобы комментировать, но я думаю, что причина:

select s._1, s._2 from s3object s

не сработало из-за того, что было сказано: "Некоторые заголовки в запросе отсутствуют в файле. Пожалуйста, проверьте файл и попробуйте снова".

_1 а также _2 не ваши заголовки - aaa, bbb, ccc являются. Итак, когда я сделал:

select s.aaa, s.bbb from s3object s

Это работало нормально и вернулся:

111,111
222,222
333,333

Так что вы можете столкнуться с ошибкой, если она не работает для вас.

ОБНОВЛЕНИЕ: чтобы немного воспользоваться ответом @john-rotenstein, я также получил "No Result", когда сделал:

select * from s3object s where aaa = 111

но я не был уверен, почему до тех пор, пока John Rotenstein упомянул об обработке чисел как строк, что сейчас очевидно, поскольку нет способа указать тип данных (INTEGER или VARCHAR или что-то еще) в CSV - так что все они эффективно обрабатываются как VARCHAR.

Так что да:

select * from s3object s where aaa = '111'

работает.

s3 select обрабатывает все как строку. select * from s3object s, где cast (aaa as int) = 111 select * from s3object s, где cast (s.aaa as int) = 111 должен возвращать ожидаемые результаты, если строки заголовка отмечены / не отмечены соответствующим образом.

Другие вопросы по тегам