Лямбда-функция: PUT S3 -> Обновить таблицу - PullRequest
0 голосов
/ 12 марта 2020

Я уже две недели борюсь с моей лямбда-функцией.

По сути, PUT-запрос в моем S3-Bucket запускает мою лямбду, которая выполняет оператор SQL, и генерируется таблица. Так и должно быть, каждый раз JSON -файл загружается в S3.

Проблема в том, что таблица (с данными) генерируется только для первого файла, который я загружаю в S3-корзину, или когда много файлов «в первый раз» загружаются в S3-корзину. «все вместе».

Как мне преодолеть эту проблему? Я новичок в Python / AWS / ... Есть ли у вас какие-либо предложения?

Ввод: когда файл загружается в S3-Bucket, таблица должна создаваться в первый раз, а для следующего файлы, таблица должна быть обновлена ​​ (запись новых JSON файлов на S3).

Надеюсь, вы мне поможете:)

Заранее спасибо!

Я вставляю код ниже:

import json
import boto3

def lambda_handler(event, context):
    query_1 = "CREATE TABLE IF NOT EXISTS auswertungen.anzahlmessungen \
    WITH ( format='JSON', external_location='s3://qs-datalake/Folderxxx/' ) AS \
    SELECT S.locationsid AS LocationID, \
    CAST(split_part(SD.datetimestamp, \
    ' ', 1) AS DATE) AS Datum, COUNT(*) AS Counter \
    FROM anreicherungen.sensors AS S \
    INNER JOIN sensordata.sensordata AS SD \
    ON CAST(S.sensorsid AS VARCHAR) = SD.sensorsid \
    GROUP BY  S.locationsid, CAST(split_part(SD.datetimestamp, ' ', 1) AS DATE);"

    database = "auswertungen"
    s3_output = "s3://aws-athena-query-results-eu-west-1-xxxxxxxx"

    client = boto3.client('athena')

    response = client.start_query_execution(QueryString = query_1,
                                        QueryExecutionContext={
                                            'Database': database
                                        },
                                        ResultConfiguration={
                                            'OutputLocation': s3_output
                                        }
                                        )
    return response

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Я отредактировал код (я не знаю, правильно ли я его пишу). Я добавил строку с оператором DROP TABLE. Но у меня все еще есть та же проблема: /

import JSON
import boto3

def lambda_handler(event, context):
    query_1 = "DROP TABLE IF EXISTS auswertungen.anzahlmessungen;"
    query_1 = "CREATE TABLE IF NOT EXISTS auswertungen.anzahlmessungen \
    WITH ( format='JSON', external_location='s3://qs-datalake/Folderxxx/' ) AS \
    SELECT S.locationsid AS LocationID, \
    CAST(split_part(SD.datetimestamp, \
    ' ', 1) AS DATE) AS Datum, COUNT(*) AS Counter \
    FROM anreicherungen.sensors AS S \
    INNER JOIN sensordata.sensordata AS SD \
    ON CAST(S.sensorsid AS VARCHAR) = SD.sensorsid \
    GROUP BY  S.locationsid, CAST(split_part(SD.datetimestamp, ' ', 1) AS DATE);"

    database = "auswertungen"
    s3_output = "s3://aws-athena-query-results-eu-west-1-xxxxxxxx"

    client = boto3.client('athena')

    response = client.start_query_execution(QueryString = query_1,
                                        QueryExecutionContext={
                                            'Database': database
                                        },
                                        ResultConfiguration={
                                            'OutputLocation': s3_output
                                        }
                                        )
    return response
0 голосов
/ 12 марта 2020

Ваша проблема с утверждением CREATE TABLE IF NOT EXISTS. Это создаст таблицу только тогда, когда она не существует, что происходит только с первым файлом.

Я предлагаю создать эту таблицу один раз, а затем сохранить ее. Если вы хотите удалить предыдущие данные перед вставкой новых данных, выполните команду TRUNCATE TABLE mytable. После этого вы можете снова вставить все данные из файла json.

Если ваша база данных не поддерживает TRUNCATE, просто добавьте DROP TABLE перед вашим утверждением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...