AWS CLI 运行 SQL 查询

问题描述 投票:0回答:2

我用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="[email protected]"
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.

python bash amazon-s3 aws-cli
2个回答
0
投票

它在 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。


0
投票

您过度使用单引号 (

'
) 字符。

例如:

--input-serialization '{'CompressionType':
第一个引号打开您的 JSON,但大括号后面的引号立即关闭引号。

相反,尝试交替使用单引号和双引号。例如:

--input-serialization '--input-serialization '{"CompressionType": "GZIP", "CSV": {

这允许单引号包含整个 JSON,而双引号则用于在 JSON 内部

结果看起来像这样(我没有测试):

aws s3api select-object-content \ --bucket bkt1 \ --key filename.gz \ --expression "SELECT * FROM s3object s where Lower(s._1) = '$SEARCH_STRING'" \ --expression-type 'SQL' \ --input-serialization '{"CompressionType": "GZIP", "CSV": { "AllowQuotedRecordDelimiter": True, "QuoteEscapeCharacter": "\"", "RecordDelimiter": "\n", "FieldDelimiter": ":", }}' \ --output-serialization '{"CSV": { "QuoteEscapeCharacter": "\"", "RecordDelimiter": "\n", "FieldDelimiter": ":", }}'
    
© www.soinside.com 2019 - 2024. All rights reserved.