首页 > 解决方案 > s3-select查询字段名数据

问题描述

我正在尝试从 s3-select 中的 json 数据中查询数据。

   {
    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 上相关内容不多。想知道我们是否可以查询字段名称!文档中没有提供带有 s3-select 的 where 子句的选择查询示例

标签: amazon-web-servicesamazon-s3amazon-s3-select

解决方案


我在任何 AWS 文档中都找不到这个,但我只是在玩耍并发现了一种有效的语法:

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

基于一些推论:

  1. 我知道当 tags 属性是一个字符串数组时,像 WHERE ('blah' in 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 文件中设置 [default] 凭据。


推荐阅读