JavaScript-从AWS S3存储桶中读取镶木地板数据(快速压缩)
在NodeJS中,我正在尝试读取拼图文件(comage=‘Snappy’),但失败。
我使用https://github.com/ironSource/parquetjsNPM模块打开并读取本地文件,但Reader.Cursor()引发神秘错误‘尚未实现’。无论使用哪种压缩(普通、RLE或Snappy)来创建输入文件,都会引发相同的错误。
以下是我的代码:
const readParquet = async (fileKey) => {
const filePath = 'parquet-test-file.plain'; // 'snappy';
console.log('----- reading file : ', filePath);
let reader = await parquet.ParquetReader.openFile(filePath);
console.log('---- ParquetReader initialized....');
// create a new cursor
let cursor = reader.getCursor();
// read all records from the file and print them
if (cursor) {
console.log('---- cursor initialized....');
let record = await cursor.next() ; // this line throws exception
while (record) {
console.log(record);
record = await cursor.next();
}
}
await reader.close();
console.log('----- done with reading parquet file....');
return;
};
调用以读取:
let dt = readParquet(fileKeys.dataFileKey);
dt
.then((value) => console.log('--------SUCCESS', value))
.catch((error) => {
console.log('-------FAILURE ', error); // Random error
console.log(error.stack);
})
详细信息: 1.我已经使用pyarrow.parket在python中生成了我的拼图文件 2.我在写文件时使用了‘Snappy’压缩 3.我可以用PYTHON阅读这些文件,没有任何问题 4.我的模式不是每次写拼花时都是固定的(未知的)。我不会在写作时创建图式。 5.错误。堆栈在控制台中打印未定义的 6.console.log(‘-ailure’,error);打印"尚未实现"
我想知道是否有人遇到过类似的问题,并有想法/解决方案可以分享。顺便说一句,我的拼图文件存储在AWS S3位置(与此测试代码不同)。我仍然需要找到从S3存储桶中读取镶木地板文件的解决方案。
如有任何帮助、建议、代码示例,我们将不胜感激。
解决方案
这里有一个https://github.com/ironSource/parquetjs分叉:https://github.com/ZJONSSON/parquetjs,它是ironSource项目的一个&q;lite&q;版本。您可以使用npm install parquetjs-lite
安装它。
ZJONSSON项目附带一个函数ParquetReader.openS3
,该函数接受S3客户端(来自AWS SDK版本2)和参数({Bucket: 'x', Key: 'y'}
)。您可能需要尝试一下,看看这是否适用于您。
如果您使用的是AWS SDK/S3客户端的版本3,我这里有一个兼容的分支:https://github.com/entitycs/parquetjs(请参阅标签功能/OpenS3v3)。
项目自述文件中的用法示例:
const parquet = require("parquetjs-lite");
const params = {
Bucket: 'xxxxxxxxxxx',
Key: 'xxxxxxxxxxx'
};
// v2 example
const AWS = require('aws-sdk');
const client = new AWS.S3({
accessKeyId: 'xxxxxxxxxxx',
secretAccessKey: 'xxxxxxxxxxx'
});
let reader = await parquet.ParquetReader.openS3(client,params);
//v3 example
const {S3Client, HeadObjectCommand, GetObjectCommand} = require('@aws-sdk/client-s3');
const client = new S3Client({region:"us-east-1"});
let reader = await parquet.ParquetReader.openS3(
{S3Client:client, HeadObjectCommand, GetObjectCommand},
params
);
// create a new cursor
let cursor = reader.getCursor();
// read all records from the file and print them
let record = null;
while (record = await cursor.next()) {
console.log(record);
}
相关文章