Amazon S3 Select From не работает - PullRequest
0 голосов
/ 08 июня 2018

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

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

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

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

select * from 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 не содержит никакой последующей информации об этой ошибке.

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

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

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

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

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

ОБНОВЛЕНИЕ: чтобы прокрутить ответ @ Джон-Ротенштайн немного, я также получил " Нет результата ", когда я сделал:

select * from s3object s where aaa = 111

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

Так что да:

select * from s3object s where aaa = '111'

работает.

0 голосов
/ 20 июня 2018

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

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

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

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

0 голосов
/ 09 июня 2018

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

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

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

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

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

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

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'
...