我需要设置一个AWS Lambda函数,该函数在将新CSV文件上传到S3存储桶时触发,以将CSV文件合并到一个Master文件中(它们将具有相同数量的列和列名),然后是新的Master文件已上传到另一个S3存储桶。
我将Python用于Lambda函数。我使用Lambda函数和我使用的依赖项(Pandas和Numpy)创建了一个zip文件夹,并将其上传。
当前,我必须将要合并的CSV文件包括在zip文件夹中,当我在CloudWatch中签入时,该功能会合并这些CSV文件,并且输出(主文件)位于日志中。
我不知道如何将我的代码链接到S3存储桶以进行输入和输出。
这是我正在开发的应用程序。
这是我正在使用的python代码:
import os
import glob
import numpy
import pandas as pd
def handler(event, context):
#find all csv files in the folder
#use glob pattern matching -> extension = 'csv'
#save result in list -> all_filenames
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
#combine all files in the list
combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames ])
#export to csv
combined_csv.to_csv( "/tmp/combined_csv.csv", index=False, encoding='utf-8-sig')
f = open("/tmp/combined_csv.csv", "r")
print(f.read())
f.close()
我不想每次都不必在与python脚本相同的zip文件夹中手动输入CSV文件,也不需要将输出的CSV主文件保存在单独的S3存储桶中。
答案 0 :(得分:0)
我建议您使用 Amazon Athena 进行此操作。
CREATE EXTERNAL TABLE
在Amazon S3中定义输入位置和格式CREATE TABLE AS
来定义Amazon S3中的输出位置和格式(CSV Zip),并带有查询(例如SELECT * FROM input-table
)这样,就无需下载,处理和上传文件。这一切将由Amazon Athena完成。另外,如果输入文件被压缩,则成本会降低,因为Athena会根据从磁盘读取的数据量来收费。
您可以从AWS Lambda函数调用Amazon Athena。只需确保仅在所有输入文件都放置到位之后 即可调用雅典娜。
答案 1 :(得分:0)
试试下面的代码:确保先下载s3fs,然后安装boto3
import s3fs
import pandas as pd
import boto3
client = boto3.client('s3')
keys = []
bucket = 'your_bucket'
resp = client.list_objects_v2(Bucket = bucket)
for i in resp['Contents']:
print(i['Key'])
if ('prefix' in i['Key']) & ('.csv' in i['Key']): // prefix filter
n = "s3://" + bucket + "/"+ i['Key']
print(n)
keys.append(n)
print(keys)
data = pd.concat([pd.read_csv((k)) for k in keys])
print(data)
data.to_csv( "final.csv", index=False, encoding='utf-8-sig') #use this line if you want to download the file local
path = "s3://bucket_name/folders/" + "filename.csv"
data.to_csv( path, index=False, encoding='utf-8-sig')