Amazon web services s3选择查询字段名上的数据
我正在尝试从S3SELECT中的json数据查询数据Amazon web services s3选择查询字段名上的数据,amazon-web-services,amazon-s3,amazon-s3-select,Amazon Web Services,Amazon S3,Amazon S3 Select,我正在尝试从S3SELECT中的json数据查询数据 { person = [ { "Id": 1, "Name": "Anshu", "Address": "Templestowe", "Car": "Jeep" } { "Id": 2, "Name": "Ben Mostafa", "Ad
{
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"
所有这些查询都可以正常工作,并根据需要返回相应的对象,但是
当我试图搜索name/Car上的数据时,它不起作用
QUERY = "select * from S3Object s where s.person.Name = \"Anshu\" "
错误:com.amazonaws.services.s3.model.amazons3异常:第1行第32列的列索引无效
s3 select online上没有太多相关内容可用。
不知道我们是否可以查询字段名!
文档中没有为s3 select提供带有where子句的select查询示例您不能这样做。您需要稍微展平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"
}
}
下面的查询将按Expected那样工作
从s3s对象中选择*s,其中s.person.name='Anshu'我在任何AWS文档中都找不到这个,但我只是在玩,发现了一个有效的语法:
QUERY = "select * from S3Object s where 'Anshu' in s.person[*].Name"
根据一些扣除:
我知道,当tags属性是字符串数组时,s.tags中的WHERE'blah'等语法会起作用。
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文档视为根级别值的数组,因此我们在SQL中使用S3Object[*]。person value是一个数组,因此我们在SQL中使用person[*]。似乎表明您所做的应该可以工作。为了使示例文件格式能够工作,我发现语法必须是s.person[Name]='Anshu'FYI,看起来AWS文档最近更新了,将星号**标识为通配符,这就是上面的语法起作用的原因。现在,您可以使用该语法,而不用担心亚马逊会将其删除,因为这是一种侥幸。拯救了我的一天!!对于那些使用SageMaker的人,我通过运行从S3对象s中选择*的标记过滤图像,其中s.test-machine-learning-image-tagging.annotations[*].class_id中的1。其中,测试机器学习图像标记是我的第一级清单键。