【问题标题】:How to insert from csv to dynamodb如何从 csv 插入 dynamodb
【发布时间】:2020-06-30 04:55:28
【问题描述】:

Dynamo db 有一个表 employees 主键作为 id

data.csv 低于csvdynamo 存储桶中上传的数据

bucket_name = csvdynamo

id,name,co
20,AB,PC
21,CD,PC
22,EF,MC
23,GH,MC

需要将上面的csv插入dynamodb

伪代码

for emp in employees:
    emp_data= emp.split(',')
    print (emp_data)

    try:
        table.put_item(
            Item = {
                "emp_id": int(emp_data[0]),
                "Name": emp_data[1],
                "Company": emp_data[2]
            }
        )
    except Exception as e:
          pass

【问题讨论】:

  • 任何其他方式也有帮助
  • “不工作的完整代码” - 你能澄清一下你的意思吗?您是否收到任何错误消息、超时、访问拒绝...?
  • @Marcin 任何不调用 event['Records'] 的替代方式都会有所帮助。删除完整代码,因为它是不必要的
  • @Marcin 我们也有帮助的任何替代方式
  • 抱歉,没时间看。今天晚些时候我会尝试一下。与此同时,也许其他人可以提供帮助。

标签: python amazon-s3 aws-lambda


【解决方案1】:

这是一个工作的 lambda 函数示例,我使用自己的函数、csv 文件和 dynamodb 对其进行了验证。我认为代码是不言自明的。对于您的最终用例,这应该是一个良好的开端

          import boto3
          import json
          import os

          bucket_name = os.environ['BUCKET_NAME']
          csv_key = os.environ['CSV_KEY_NAME'] # csvdynamo.csv
          table_name = os.environ['DDB_TABLE_NAME']
          
          # temprorary file to store csv downloaded from s3
          tmp_csv_file = '/tmp/' + csv_key

          s3 = boto3.resource('s3')
          db_table = boto3.resource('dynamodb').Table(table_name)

          def save_to_dynamodb(id, name, co):

            return db_table.put_item(
                Item={
                  'emp_id': int(id),
                  'Name': name,
                  'Company': co
                })

          def lambda_handler(event, context):

              s3.meta.client.download_file(
                            bucket_name, 
                            csv_key, 
                            tmp_csv_file)

              with open(tmp_csv_file, 'r') as f:

                next(f) # skip header

                for line in f:

                  id, name, co = line.rstrip().split(',')

                  result = save_to_dynamodb(id, name, co)

                  print(result)

              return {'statusCode': 200}

【讨论】:

【解决方案2】:

需要告知 DynamoDB 插入的字段类型。

来自put_item()Item 的格式为:

    Item={
        'string': {
            'S': 'string',
            'N': 'string',
            'B': b'bytes',
            'SS': [
                'string',
            ],
            'NS': [
                'string',
            ],
            'BS': [
                b'bytes',
            ],
            'M': {
                'string': {'... recursive ...'}
            },
            'L': [
                {'... recursive ...'},
            ],
            'NULL': True|False,
            'BOOL': True|False
        }
    },

因此,您需要以下内容:

        table.put_item(
            Item = {
                "emp_id":  {'N': emp_data[0]},
                "Name":    {'S': emp_data[1]},
                "Company": {'S': emp_data[2]}
            }
        )

【讨论】:

猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 2014-05-28
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多