如何将数据从AWS s3导入dynamoDB?

时间:2018-08-18 08:10:02

标签: amazon-web-services amazon-s3 amazon-dynamodb

如何从公共数据集 This link, this is a public dataset 将AWS s3中的数据导入dynamoDB?

我尝试了多种方法来导入数据,aws管道,aws athena,但这些方法均无效。我也尝试使用node.js导入数据,但没有用。我也将公共数据集下载到了笔记本电脑中,但是在dynamoDB网站上找不到导入按钮。

你们能推荐一种从s3到dynamoDB导入日期的有效且成本更低的方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

编写一个自定义脚本来下载数据,并将记录中的记录逐条插入DynamoDB中。您可以使用batchWriteItem API在一个API调用中插入多个记录(最多25条)。请注意,这仍然会为每个插入的记录消耗1个写容量单位(假设记录<1k)。

AWS数据迁移服务也可以为您执行此操作,但是您自己的脚本将不花费任何费用(除了DynamoDB配置的写入操作之外)。

答案 1 :(得分:0)

这对我推送 9 万条记录有用。

`const AWS = require('aws-sdk') AWS.config.region = process.env.AWS_REGION const s3 = 新的 AWS.S3()

const docClient = new AWS.DynamoDB.DocumentClient()
const ddbTable = "your-table" 

// The Lambda handler
exports.handler = async (event) => {
  console.log (JSON.stringify(event, null, 2))
  console.log('Using DDB table: ', ddbTable)

  await Promise.all(
    event.Records.map(async (record) => {
      try {
        console.log('Incoming record: ', record)

        // Get original text from object in incoming event
        const originalText = await s3.getObject({
          Bucket: event.Records[0].s3.bucket.name,
          Key: event.Records[0].s3.object.key
        }).promise()

        // Upload JSON to DynamoDB
        const jsonData = JSON.parse(originalText.Body.toString('utf-8'))
        await ddbLoader(jsonData)

      } catch (err) {
        console.error(err)
      }
    })
  )
}

// Load JSON data to DynamoDB table
const ddbLoader = async (data) => {
  // Separate into batches for upload
  let batches = []
  const BATCH_SIZE = 25

  while (data.length > 0) {
    batches.push(data.splice(0, BATCH_SIZE))
  }

  console.log(`Total batches: ${batches.length}`)

  let batchCount = 0

  // Save each batch
  await Promise.all(
    batches.map(async (item_data) => {

      // Set up the params object for the DDB call
      const params = {
        RequestItems: {}
      }
      params.RequestItems[ddbTable] = []

      item_data.forEach(item => {
        for (let key of Object.keys(item)) {
          // An AttributeValue may not contain an empty string
          if (item[key] === '') 
            delete item[key]
        }

        // Build params
        params.RequestItems[ddbTable].push({
          PutRequest: {
            Item: {
              ...item
            }
          }
        })
      })

      // Push to DynamoDB in batches
      try {
        batchCount++
        console.log('Trying batch: ', batchCount)
        const result = await docClient.batchWrite(params).promise()
        console.log('Success: ', result)
      } catch (err) {
        console.error('Error: ', err)
      }
    })
  )
}`