如何从公共数据集 This link, this is a public dataset 将AWS s3中的数据导入dynamoDB?
我尝试了多种方法来导入数据,aws管道,aws athena,但这些方法均无效。我也尝试使用node.js导入数据,但没有用。我也将公共数据集下载到了笔记本电脑中,但是在dynamoDB网站上找不到导入按钮。
你们能推荐一种从s3到dynamoDB导入日期的有效且成本更低的方法。
谢谢!
答案 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)
}
})
)
}`