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 должен возвращать ожидаемые результаты, если строки заголовка отмечены / не отмечены соответствующим образом.