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"

На основании некоторых вычетов:

  1. Я знаю, что такой синтаксис, как WHERE ("бла" в s.tags), работает, когда свойство tags является массивом строк.
  2. В документации 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'

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