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"
根据一些推论:
- 我知道像 WHERE ('blah' in s.tags) 这样的语法在标签 属性 是字符串数组时起作用。
- 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[*]
我正在尝试从 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"
根据一些推论:
- 我知道像 WHERE ('blah' in s.tags) 这样的语法在标签 属性 是字符串数组时起作用。
- 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[*]