Оператор LIKE работает с лямбда-функцией AWS, но не = - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть небольшой CSV-файл, который выглядит так:

is_employee,candidate_id,gender,hesa_type,university
FALSE,b9bb80,Male,Mathematical sciences,Birmingham
FALSE,8e552d,Female,Computer science,Swansea
TRUE,2bc475,Male,Engineering & technology,Aston
TRUE,c3ac8d,Female,Mathematical sciences,Heriot-Watt
FALSE,ceb2fa,Female,Mathematical sciences,Imperial College London

Следующая лямбда-функция используется для запроса из s3bucket.

import boto3
import os
import json

def lambda_handler(event, context):
    BUCKET_NAME = 'foo'
    KEY = 'bar/data.csv'  
    s3 = boto3.client('s3','eu-west-1')
    response = s3.select_object_content(
        Bucket = BUCKET_NAME,
        Key = KEY,
        ExpressionType = 'SQL',
        Expression = 'Select count(*) from s3object s where s.gender like \'%Female%\'',
        InputSerialization = {'CSV': {"FileHeaderInfo": "Use"}},
        OutputSerialization = {'JSON': {}},
    )

    for i in response['Payload']:
        if 'Records' in i:
            query_result = i['Records']['Payload'].decode('utf-8')

    print(list(json.loads(query_result).values())[0])

Теперь это прекрасно работает как Я получаю обратно результат 3. Но по какой-то причине тот же код не работает при изменении оператора like на =, результаты падают до 0, поэтому совпадение не найдено. Что здесь происходит?

1 Ответ

1 голос
/ 11 февраля 2020

Итак, я нашел проблему. Проблема заключалась в том, что за элементами последнего столбца следовал символ новой строки, который не был понят интерпретатором AWS S3. На самом деле, название университета было не Swansea, а больше Swansea\n.

Так что s.university = \'Swansea\'' не работает; тем не менее, s.university LIKE \'Swansea%\'' работает и все еще является выражением саркастии.

...