Python Lambda函数:放置S3-->;更新表
两周以来,我一直在努力学习Lambda函数 基本上,S3存储桶中的PUT请求触发Lambda,该Lambda运行SQL语句,并生成一个表。应该是这样的,每次在S3中上传一个JSON文件 问题是,该表(包含数据)仅为我在S3存储桶中上载的第一个文件生成,或者当许多文件“第一次”一起上载到S3存储桶中时生成 我怎样才能克服这个问题?我是Python/AWS/的新手。。。你有什么建议吗 输入:当一个文件上传到S3存储桶中时,应该第一次创建该表,对于下一个文件,该表应该更新(在S3中写入新的JSON文件) 我希望你能帮助我:) 提前谢谢你 我将代码粘贴到下面: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文件
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之前覆盖了它。您认为我应该如何做?