簡體   English   中英

Javascript - 從 AWS s3 存儲桶讀取鑲木地板數據(使用快速壓縮)

[英]Javascript - Read parquet data (with snappy compression) from AWS s3 bucket

nodeJS 中,我試圖讀取鑲木地板文件(compression='snappy')但沒有成功。

我使用https://github.com/ironSource/parquetjs npm 模塊打開本地文件並讀取它,但 reader.cursor() 拋出神秘錯誤“尚未實現”。 無論使用哪種壓縮(plain、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.parquet 在 python 中生成了我的鑲木地板文件 2. 我在寫入文件時使用了 'SNAPPY' 壓縮 3. 我可以在 python 中讀取這些文件而沒有任何問題 4. 我的架構不固定(未知)每次我寫鑲木地板文件。 我在寫作時不創建模式。 5. error.stack 在控制台打印undefined 6. console.log('-------FAILURE ', error); 打印“尚未實施”

我想知道是否有人遇到過類似的問題並有想法/解決方案可以分享。 順便說一句,我的鑲木地板文件存儲在 AWS S3 位置(與此測試代碼不同)。 我仍然需要找到從 S3 存儲桶讀取鑲木地板文件的解決方案。

任何幫助、建議、代碼示例將不勝感激。

使用var AWS = require('aws-sdk'); 從 S3 獲取數據。

然后使用node-parquet將 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";

這里有一個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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM