AWS CLI для запуска SQL запрос - PullRequest
0 голосов
/ 02 августа 2020

У меня есть следующий код, написанный на Python. Я использую sh, чтобы перенести его на Bash, или использую просто старый AWS CLI. Задача состоит в том, чтобы выполнить запрос SQL в ведре S3, используя S3 Select. Примечание: все файлы в S3 заархивированы.

Существующий 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. Помогите, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 09 августа 2020

У меня все отлично работало на 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 голосов
/ 03 августа 2020

Вы чрезмерно используете символ одинарной кавычки (').

Например: --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": ":",
            }}'  
...