【问题标题】:Export DynamoDB to CSV on S3 with Lambda function (python)使用 Lambda 函数 (python) 在 S3 上将 DynamoDB 导出为 CSV
【发布时间】:2021-05-18 19:22:19
【问题描述】:

您好,我正在尝试使用 lambda 函数从 dynamoDB 生成 CSV 到 S3。问题是我只是在 s3 上得到一个空文件。请您帮忙!

import csv
import boto3
import json
dynamodb = boto3.resource('dynamodb')
db = dynamodb.Table('ReporteTelefonica')
def lambda_handler(event, context):
    AWS_BUCKET_NAME = 'reportetelefonica'
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(AWS_BUCKET_NAME)
    path = 'test.csv'
    try:
        response = db.scan()
        myFile = open(path, 'w')  

        for i in response['Items']:
            csv.register_dialect('myDialect', delimiter=',', quoting=csv.QUOTE_NONE)
            with myFile:
                writer = csv.writer(myFile, dialect='myDialect')
                writer.writerows(i)
            print(i)
    except :
        print("error")

    bucket.put_object(
        ACL='public-read-write',
        ContentType='application/csv',
        Key=path,
        # Body=json.dumps(i),
    )
    # print("here")
    body = {
        "uploaded": "true",
        "bucket": AWS_BUCKET_NAME,
        "path": path,
    }
    # print("then here")
    return {
        "statusCode": 200,
        "body": json.dumps(body)
    }

我对此有点菜鸟,所以我想知道我应该修改什么才能成功完成对表的完整扫描并将值写入 S3 的 CSV 上???

【问题讨论】:

    标签: python amazon-web-services amazon-s3 aws-lambda amazon-dynamodb


    【解决方案1】:

    这是一个可以完成这项工作的工作 lambda。

    import boto3
    import json
    import os
    import pandas as pd
    
    TABLE_NAME = os.environ.get("DDB_TABLE_NAME")
    OUTPUT_BUCKET = os.environ.get("BUCKET_NAME")
    TEMP_FILENAME = '/tmp/export.csv'
    OUTPUT_KEY = 'export.csv'
    
    s3_resource = boto3.resource('s3')
    dynamodb_resource = boto3.resource('dynamodb')
    table = dynamodb_resource.Table(TABLE_NAME)
    
    
    def lambda_handler(event, context):
        response = table.scan()
        df = pd.DataFrame(response['Items'])
        df.to_csv(TEMP_FILENAME, index=False, header=True)
    
        # Upload temp file to S3
        s3_resource.Bucket(OUTPUT_BUCKET).upload_file(TEMP_FILENAME, OUTPUT_KEY)
    
        return {
            'statusCode': 200,
            'headers': {
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Credentials": True,
                "content-type": "application/json"
            },
            'body': json.dumps('OK')
        }
    

    【讨论】:

      【解决方案2】:

      您必须在写完 cvs 记录后关闭文件,然后重新打开以读取并传递给 put_obkect 方法。 或者,您打开文件进行读写,并在写入后寻找位置 0,以便 put_object 方法从头开始读取。

      【讨论】:

        猜你喜欢
        • 2021-03-01
        • 2018-08-15
        • 2021-01-28
        • 1970-01-01
        • 2020-10-05
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多