python - AWS CLI 运行 SQL 查询
问题描述
我有以下用 Python 编写的代码。我希望将它迁移到 Bash,或者只使用普通的旧 AWS CLI。任务是使用 S3 Select 在 S3 存储桶上运行 SQL 查询。注意:S3 中的文件都是 gzip 压缩的。
现有的 Python 代码(工作)
ACCESS_KEY = 'Key1'
SECRET_KEY = 'Key2'
s3 = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
r = s3.select_object_content(
Bucket='bkt1',
Key=file2search,
ExpressionType='SQL',
Expression="SELECT * FROM s3object s where Lower(s._1) = (%r)" % ("SEARCH_STRING"),
InputSerialization = {'CompressionType': 'GZIP', 'CSV': {
'AllowQuotedRecordDelimiter': True,
'QuoteEscapeCharacter': '"',
'RecordDelimiter': '\n',
'FieldDelimiter': ':',
}},
OutputSerialization = {'CSV': {
'QuoteEscapeCharacter': '"',
'RecordDelimiter': '\n',
'FieldDelimiter': ':',
}}
)
Bash 代码(不工作)
SEARCH_STRING="hello@world.com"
aws s3api select-object-content \
--bucket projectbucket2 \
--key abc.gz \
--expression "SELECT * FROM s3object s where Lower(s._1) = \'$SEARCH_STRING\'" \
--expression-type 'SQL' \
--input-serialization '{"CSV": {}, "CompressionType": "GZIP"}' \
--output-serialization '{"CSV": {}}' "output.csv"
代码抛出错误:An error occurred (LexerInvalidChar) when calling the SelectObjectContent operation: Invalid character at line 1, column 46.
请帮忙。
解决方案
它在 Ubuntu 上对我来说非常好用:
ubuntu@ip-172-31-8-201:~$ aws --version
aws-cli/2.0.38 Python/3.7.3 Linux/5.3.0-1023-aws exe/x86_64.ubuntu.18
ubuntu@ip-172-31-8-201:~$ echo $SEARCH_STRING
taipei 101
ubuntu@ip-172-31-8-201:~$ aws s3api select-object-content --bucket my-bucket --key towers.csv --expression "SELECT * FROM s3object s where Lower(s._2) = '$SEARCH_STRING'" --expression-type 'SQL' --input-serialization '{"CSV": {}, "CompressionType": "NONE"}' --output-serialization '{"CSV": {}}' "output.csv"
ubuntu@ip-172-31-8-201:~$ cat output.csv
5,Taipei 101,Taipei,Taiwan,509,1670,101,2004
我使用的是 AWS CLI v2。
推荐阅读
- c++ - 传递可变大小的多维数组
- terraform - 如何创建 `.terraform/providers/linux_amd64/lock.json` 文件?
- swagger - 使用 ref 参数时如何指定所需的属性?
- java - 使用 JAVA 修改 LDAP 中的用户属性
- owasp - OWASP CRS MoD 安全误报 - 规则 942150 “@contains”
- python - 使用 selenium 的点击音频挑战 recaptcha v2 的问题
- javascript - 角滑动网格 | 如何动态禁用selectableOverride的checkboxSelector的行选择
- reactjs - 我的 firebase 上有大量阅读资料,如何冻结我的 React Firebase 应用程序的对象?
- drake - Drake 中输入和输出端口之间的仿射关系
- python - 如何从python中的另一个模块获取变量名