s3-выберите запрос данных по имени поля
Я пытаюсь запросить данные из данных JSON в S3-выберите.
{
person = [
{
"Id": 1,
"Name": "Anshu",
"Address": "Templestowe",
"Car": "Jeep"
}
{
"Id": 2,
"Name": "Ben Mostafa",
"Address": "Las Vegas",
"Car": "Mustang"
}
{
"Id": 3,
"Name": "Rohan Wood",
"Address": "Wooddon",
"Car": "VW"
}
]
}
QUERY = "select * from S3Object s"
QUERY = "select s.person from S3Object s"
QUERY = "select s.person[0] from S3Object s"
QUERY = "select s.person[0].Name from S3Object s"
Все эти запросы работают нормально и возвращают соответствующий объект по желанию, но когда я пытаюсь найти данные по имени / автомобилю, он не работает.
QUERY = "select * from S3Object s where s.person.Name = \"Anshu\" "
ошибка: com.amazonaws.services.s3.model.AmazonS3Exception: индекс столбца в строке 1, столбец 32 недопустим.
На s3-select online не так много похожего контента. Интересно, можем ли мы запросить имя поля или нет! Нет примеров запроса select с предложением where для s3-select, приведенным в документации
2 ответа
Я не могу найти это ни в одной документации AWS, но я просто поиграл и обнаружил работающий синтаксис:
QUERY = "select * from S3Object s where 'Anshu' in s.person[*].Name"
На основании некоторых вычетов:
- Я знаю, что такой синтаксис, как WHERE ("бла" в s.tags), работает, когда свойство tags является массивом строк.
- В документации AWS также говорится, что s.person[#] должен работать, когда # является допустимым индексом / цифрой. Исходя из этого, я обнаружил, что использование звездочки (*) между квадратными скобками, как в s.person[*].Name, также работает. Это после неудачного тестирования различных синтаксисов, таких как s.Person[], s.Person[#], s.Person[?] И т. Д.
Доказательство с Python и Boto3:
import boto3
S3_BUCKET = 'your-bucket-name'
s3 = boto3.client('s3')
r = s3.select_object_content(
Bucket=S3_BUCKET,
Key='your-file-name.json',
ExpressionType='SQL',
Expression="select * from s3object s where 'Anshu' in s.person[*].Name",
InputSerialization={'JSON': {"Type": "Lines"}},
OutputSerialization={'JSON': {}}
)
for event in r['Payload']:
if 'Records' in event:
records = event['Records']['Payload'].decode('utf-8')
print(records)
Странно, я знаю. Не забудьте установить учетные данные [по умолчанию] в файле ~/.aws/credentials.
После прочтения документа AWS я обнаружил, что следующий SQL работает нормально.
select * from S3Object[*].person[*] as p where p.Name='Anshu'
Этот SQL даст вам всех, чье имя 'Anshu', например:
{
"Id": 1,
"Name": "Anshu",
"Address": "Templestowe",
"Car": "Jeep"
}
Когда ты видишь [*]
, это означает массив JSON.
Amazon S3 Select всегда рассматривает документ JSON как массив значений корневого уровня, поэтому мы используем S3Object[*]
в SQL. А также person
значение является массивом, поэтому мы используем person[*]
в SQL.
Вы не можете сделать это таким образом. Вам нужно немного "сплющить" ваш JSON, чтобы он выглядел так:
{
person: {
"Id": 1,
"Name": "Anshu",
"Address": "Templestowe",
"Car": "Jeep"
}
}
{
person: {
"Id": 2,
"Name": "Ben Mostafa",
"Address": "Las Vegas",
"Car": "Mustang"
}
}
{
person:{
"Id": 3,
"Name": "Rohan Wood",
"Address": "Wooddon",
"Car": "VW"
}
}
Запрос ниже будет работать как тогда
выберите * из s3object s, где s.person.name= 'Anshu'