Javascript - чтение данных паркета (с мгновенным сжатием) из ведра AWS s3

В nodeJS я пытаюсь прочитать файл паркета (сжатие = 'snappy'), но безуспешно.

Я использовал модуль npm https://github.com/ironSource/parquetjs, чтобы открыть локальный файл и прочитать его. но 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. Я сгенерировал свои паркетные файлы на python с помощью pyarrow.parquet 2. Я использовал сжатие SNAPPY при записи файла 3. Я могу читать эти файлы в python без каких-либо проблем 4. Моя схема не исправлена ​​(неизвестно) каждый раз пишу паркетный файл. Я не создаю схему во время написания. 5. error.stack выводит в консоли undefined 6. console.log ('------- FAILURE', error); печатает "еще не реализовано"

Я хотел бы знать, сталкивался ли кто-нибудь с подобной проблемой и есть ли идеи / решения, которыми можно поделиться. Кстати, мои паркетные файлы хранятся на AWS S3 (в отличие от этого тестового кода). Мне все еще нужно найти решение, чтобы прочитать паркетный файл из ведра S3.

Любая помощь, предложения, пример кода будут высоко оценены.


person Test Test    schedule 18.07.2018    source источник
comment
ты нашел решение?   -  person Joe    schedule 01.03.2019


Ответы (2)


Используйте 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";
person Joe    schedule 08.03.2019

Здесь есть форк https://github.com/ironSource/parquetjs: https://github.com/ZJONSSON/parquetjs, который является облегченной версией проекта ironSource. Вы можете установить его, используя npm install parquetjs-lite.

Проект ZJONSSON поставляется с функцией ParquetReader.openS3, которая принимает s3-клиент (из версии 2 AWS SDK) и параметры ({Bucket: 'x', Key: 'y'}). Вы можете попробовать и посмотреть, работает ли это для вас.

Если вы используете версию 3 клиента AWS SDK / S3, у меня есть совместимый форк: https://github.com/entitycs/parquetjs (см. тег feature / 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);
}
person entitycs    schedule 28.01.2021