Sử dụng Node.js, với ý định chạy mô -đun này như một hàm AWS Lambda.
Sử dụng s3.getObject() từ aws-sdk, tôi có thể chọn thành công một tệp CSV rất lớn từ Amazon S3. Ý định là đọc từng dòng trong tệp và phát ra một sự kiện với phần thân của mỗi dòng.
Trong tất cả các ví dụ tôi có thể tìm thấy, có vẻ như toàn bộ tệp CSV trong S3 phải được đệm hoặc phát trực tuyến, chuyển đổi thành một chuỗi và sau đó đọc từng dòng.
s3.getObject(params, function(err, data) { var body = data.Body.toString('utf-8'); }Hoạt động này mất một thời gian rất dài, với kích thước của tệp CSV nguồn. Ngoài ra, các hàng CSV có độ dài khác nhau và tôi không chắc chắn nếu tôi có thể sử dụng kích thước bộ đệm làm tùy chọn.
Câu hỏi
Có cách nào để chọn tệp S3 trong Node.js và đọc/chuyển đổi nó từng dòng, điều này tránh chuỗi toàn bộ tệp trong bộ nhớ trước không?
Lý tưởng nhất, tôi thích sử dụng các khả năng tốt hơn của fast-csv và/hoặc node-csv, thay vì lặp bằng tay.
Trong dự án của tôi, tôi cần viết một số mã tải xuống tệp CSV từ S3 và chuyển đổi nó thành định dạng JSON. Tôi chỉ chia sẻ những gì tôi đã làm và tạo ra một số ghi chú ngắn gọn cho mỗi API.
Môi trường
- Nút: 8.10.0
- AWS-SDK: 2.211.1
- CSVTOJSON: 2.0.8
Kiến thức giả định
- Cách nhận/đặt thông tin xác thực AWS
- Cách sử dụng và xác định các thông tin đăng nhập trong tệp .ENV
const AWS = require('aws-sdk');
const csv = require('csvtojson');const S3 = new AWS.S3();const params = {
Bucket: 'bucket name',
Key: 'csv file name'
};async function csvToJSON() { // get csv file and create stream
const stream = S3.getObject(params).createReadStream(); // convert csv file (stream) to JSON format data
const json = await csv().fromStream(stream);
console.log(json);
};csvToJSON();
getObject (): Lấy các đối tượng từ S3Retrieve the objects from S3
//docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
GetObject ().Pipe the objects from S3 to Node.js Stream object
CSV (). FromStream (ReadableStream): Chuyển đổi sang JSON từ CSV ReadableStream.Convert to JSON from CSV readableStream.
Sự kết luận
Trên thực tế, tôi không biết chính xác đối tượng luồng trong Node.js là gì. Nhiệm vụ đã cho tôi một cơ hội để suy nghĩ về nó sâu sắc hơn. Ngoài ra, đây là bài viết đầu tiên của tôi trên trung bình. Tôi sẽ chia sẻ những gì tôi nghĩ, đã làm và trải nghiệm. Tôi hy vọng bài viết của tôi sẽ giúp ai đó. Cảm ơn bạn.
Cách sử dụng AWS S3 Chọn và Node.js
Cách sử dụng AWS S3 Chọn
Ảnh của Arif Riyanto trên unplashHôm nay tôi sẽ nói về S3 Chọn, một tính năng có thể giúp bạn trực tiếp lọc CSV.
Một trường hợp sử dụng thú vị là khi bạn có một CSV lớn (~ 100MB) nhưng chỉ cần một vài hàng của nó, được lọc theo ngày hoặc theo một danh mục, và bạn cũng muốn có kết quả trong JSON. Quá trình sau đây có thể làm giảm việc sử dụng bộ nhớ bên trong hàm Lambda và tạo các giải pháp để lọc hoặc chuyển đổi không cần thiết.
Nghe có vẻ tốt, phải không? Hãy xem nào:
const { SelectObjectContentCommand, S3Client } = require('@aws-sdk/client-s3');const readFileCSV = async (Bucket, Key) => {const params = {
Bucket,
Key,
ExpressionType: 'SQL',
Expression: 'SELECT * FROM s3object s WHERE s."category" = "myCategory"',
InputSerialization: {
CSV: {
FileHeaderInfo: 'Use',
FieldDelimiter: ';',
},
CompressionType: 'NONE',
},
OutputSerialization: {
JSON: {
RecordDelimiter: ',',
},
},
};
const command = new SelectObjectContentCommand(params);
const response = await client.send(command);
return response.Payload;
}
Chúng ta có thể sử dụng biểu thức SQL thông qua ExpressionType và Expression để lọc các bản ghi từ tệp CSV. Chúng tôi có thể thêm thông tin về việc đọc CSV với require('dotenv').config();
const AWS = require('aws-sdk');
const csv = require('csvtojson');const S3 = new AWS.S3();const params = {
Bucket: 'bucket name',
Key: 'csv file name'
};async function csvToJSON() { // get csv file and create stream
const stream = S3.getObject(params).createReadStream(); // convert csv file (stream) to JSON format data
const json = await csv().fromStream(stream);
console.log(json);
};csvToJSON();0 và về cách xuất bản ghi bằng require('dotenv').config();
const AWS = require('aws-sdk');
const csv = require('csvtojson');const S3 = new AWS.S3();const params = {
Bucket: 'bucket name',
Key: 'csv file name'
};async function csvToJSON() { // get csv file and create stream
const stream = S3.getObject(params).createReadStream(); // convert csv file (stream) to JSON format data
const json = await csv().fromStream(stream);
console.log(json);
};csvToJSON();1.
Mỗi bản ghi trong đầu ra sẽ ở trong JSON nhưng sẽ không trả lại một mảng các đối tượng JSON, vì vậy chúng tôi cần thực hiện một mẹo nhỏ và biến đổi nó trong một đối tượng JavaScript. Vì vậy, như đã nêu trong các tệp đọc từ Amazon S3 bằng Node.js, chúng ta cần chuyển đổi các khối bộ đệm thành một chuỗi và sau đó phân tích cú pháp trong JSON.
const convertDataToJson = async (generator) => {const chunks = [];
for await (const value of generator) {
if (value.Records) {
chunks.push(value.Records.Payload);
}
} let payload = Buffer.concat(chunks).toString('utf8');
payload = payload.replace(/,$/, '');
return JSON.parse(`[${payload}]`);
};
Bây giờ chúng tôi có một CSV được lọc và chuyển đổi mà không cần sử dụng bất kỳ thư viện nào và chúng tôi có thể tăng hiệu suất của chức năng Lambda.
Hẹn sớm gặp lại!