amazon-web-services - 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 子句的选择查询示例
解决方案
我在任何 AWS 文档中都找不到这个,但我只是在玩耍并发现了一种有效的语法:
QUERY = "select * from S3Object s where 'Anshu' in s.person[*].Name"
基于一些推论:
- 我知道当 tags 属性是一个字符串数组时,像 WHERE ('blah' in s.tags) 这样的语法会起作用。
- 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] 凭据。
推荐阅读
- javascript - Chai-http/mocha 总是返回一个 HTTP 404
- mongodb - 对 MongoDB 的初始 POST 在我没有添加任何内容的数组中创建一个空对象
- django - Django send_mail 方法:在邮件消息中包含会话用户 ID
- mysql - Mysql 查找表(Mysql 性能问题)
- outlook - 在 displayNewAppointmentForm Office.js 中插入 HTML
- django - 尊重 DRY django 的表单字段
- pandas - 如何获得一列的平均值取决于其他列类别
- javascript - Powershell表单窗口不允许javascript运行
- javascript - 如何使用获取客户端进行数据查询注销 401?
- c++ - 如何定义一个函数来处理移动语义和复制语义?