Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services s3选择查询字段名上的数据_Amazon Web Services_Amazon S3_Amazon S3 Select - Fatal编程技术网

Amazon web services s3选择查询字段名上的数据

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

我正在尝试从S3SELECT中的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"
所有这些查询都可以正常工作,并根据需要返回相应的对象,但是 当我试图搜索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。其中,测试机器学习图像标记是我的第一级清单键。