s3-выберите запрос данных по имени поля - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь запросить данные из данных json в s3-select.

   {
    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, приведенным в документации

Ответы [ 3 ]

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

Я не могу найти это ни в одной документации AWS, но я просто поиграл и обнаружил рабочий синтаксис:

QUERY = "select * from S3Object s where 'Anshu' in s.person[*].Name"

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

  1. Я знаю, что такой синтаксис, как WHERE («бла» в s.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.

0 голосов
/ 09 января 2019

После прочтения документа 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.

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

Вы не можете сделать это таким образом. Вам нужно несколько «сплющить» ваш 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"
    }
}

Приведенный ниже запрос будет работать, как указано, тогда

select * from s3object s where s.person.name= 'Anshu'

...