s3-select查询字段名数据

s3-select querying data on field name

我正在尝试从 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"

所有这些查询都可以正常工作,并且 returns 所需的相应对象但是 当我尝试在 name/Car 上搜索数据时,它不起作用。

QUERY = "select * from S3Object s where s.person.Name = \"Anshu\" "

错误:com.amazonaws.services.s3.model.AmazonS3Exception:第 1 行第 32 列的列索引无效。

s3-select网上相关内容不多。 想知道我们是否可以查询字段名称! 文档

中没有为 s3-select 提供带有 where 子句的 select 查询示例

你不能那样做。你需要 "flatten" 你的 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'

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

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

根据一些推论:

  1. 我知道像 WHERE ('blah' in s.tags) 这样的语法在标签 属性 是字符串数组时起作用。
  2. AWS 文档还说 s.person[#] 应该在 # 是有效的 index/digit 时工作。基于此,我发现在方括号之间使用星号 (*),如 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 文档视为根级别值的数组,因此我们在 SQL 中使用 S3Object[*]。而person的值是一个数组,所以我们在SQL.

中使用person[*]