Python Lambda函数:放置S3-->;更新表

Python Lambda函数:放置S3-->;更新表,python,amazon-web-services,amazon-s3,aws-lambda,Python,Amazon Web Services,Amazon S3,Aws Lambda,两周以来,我一直在努力学习Lambda函数 基本上,S3存储桶中的PUT请求触发Lambda,该Lambda运行SQL语句,并生成一个表。应该是这样的,每次在S3中上传一个JSON文件 问题是,该表(包含数据)仅为我在S3存储桶中上载的第一个文件生成,或者当许多文件“第一次”一起上载到S3存储桶中时生成 我怎样才能克服这个问题?我是Python/AWS/的新手。。。你有什么建议吗 输入:当一个文件上传到S3存储桶中时,应该第一次创建该表,对于下一个文件,该表应该更新(在S3中写入新的JSON文件

两周以来,我一直在努力学习Lambda函数

基本上,S3存储桶中的PUT请求触发Lambda,该Lambda运行SQL语句,并生成一个表。应该是这样的,每次在S3中上传一个JSON文件

问题是,该表(包含数据)仅为我在S3存储桶中上载的第一个文件生成,或者当许多文件“第一次”一起上载到S3存储桶中时生成

我怎样才能克服这个问题?我是Python/AWS/的新手。。。你有什么建议吗

输入:当一个文件上传到S3存储桶中时,应该第一次创建该表,对于下一个文件,该表应该更新(在S3中写入新的JSON文件)

我希望你能帮助我:)

提前谢谢你

我将代码粘贴到下面:

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

您的问题在于语句
创建表(如果不存在)
。这只会在表不存在时创建表,这只会发生在第一个文件上

我建议您创建此表一次,然后保留它。如果要在插入新数据之前删除以前的数据,请运行
TRUNCATE TABLE mytable
。之后,您可以再次插入json文件中的所有数据

如果您的数据库不支持
TRUNCATE
,则只需在您的语句之前添加一个。

我已经编辑了代码(我不知道我是否以正确的方式编写了代码)。我添加了带有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

你会在你的答案中添加另一个部分吗(在你已经发布的内容下面)?在那里,很高兴看到您是如何尝试的。请不要将此作为答案发布,而是扩展您的问题。此代码不会执行您期望的操作,因为您没有执行drop table查询,只是执行create table查询。这是因为您在执行查询_1之前覆盖了它。您认为我应该如何做?