Javascript-从AWS s3存储桶读取镶木地板数据(使用快速压缩)

时间:2018-07-18 21:34:46

标签: javascript node.js amazon-s3 parquet snappy

nodeJS 中,我试图读取实木复合地板文件(compression ='snappy'),但未成功。

我使用了https://github.com/ironSource/parquetjs npm模块来打开本地文件并读取它,但是reader.cursor()抛出了隐秘错误“ 尚未实现”。使用哪个压缩(普通,rle或快照)创建输入文件都没有关系,它会引发相同的错误。

这是我的代码:

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.parquet用python生成了我的实木复合地板文件 2.我在写文件时使用了“ SNAPPY”压缩 3.我可以用python读取这些文件而没有任何问题 4.每次编写镶木地板文件时,我的架构都不固定(未知)。我在编写时不创建架构。 5. error.stack在控制台中打印 undefined 6. console.log('------- FAILURE',错误);打印“尚未实施”

我想知道是否有人遇到过类似的问题并且有想法/解决方案可以分享。顺便说一句,我的实木复合地板文件存储在AWS S3位置(不同于此测试代码)。我仍然必须找到从S3存储桶读取实木复合地板文件的解决方案。

我们将不胜感激任何帮助,建议和代码示例。

2 个答案:

答案 0 :(得分:0)

使用var AWS = require('aws-sdk');从S3获取数据。

然后使用node-parquet将实木复合地板文件读入变量。

import np = require('node-parquet');

// Read from a file:
var reader = new np.ParquetReader(`file.parquet`);
var parquet_info = reader.info();
var parquet_rows = reader.rows();
reader.close();
parquet_rows = parquet_rows + "\n";

答案 1 :(得分:0)

此处有 https://github.com/ironSource/parquetjs 的一个分支:https://github.com/ZJONSSON/parquetjs,它是 IronSource 项目的“精简版”版本。您可以使用 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)。

来自项目 README.md 的示例用法:

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);
}