Как создать ORC (или паркет) файлы в JavaScript? - PullRequest
0 голосов
/ 09 мая 2019

В серверном модуле javascript мне нужно записать данные в файл ORC, но я не смог найти подсказки, как это сделать.В идеале мой модуль должен также иметь возможность альтернативной записи в файл паркета.В случае ORC мне также было бы интересно узнать, как это сделать в python.

В случае с паркетом я видел, как это делается в python с использованием библиотеки pyarrow для Apache-Arrow .В документации Apache Arrow утверждается, что поддерживаются форматы файлов ORC и parquet.Существует также модуль узла Apache Arrow , но в их справочнике по API я не могу найти ничего на ORC или паркете.

Здесь, на SO, я нашел ссылки на parquetjs и node-parquet узловые модули, но ничего для ORC.Также, если возможно, я бы предпочел использовать Apache Arrow.

У кого-нибудь есть для меня какие-нибудь указатели?

1 Ответ

0 голосов
/ 11 мая 2019

Обновление:

Ваш вопрос побудил меня собрать небольшое подтверждение концепции , чтобы сделать стрелку -> parquetjs.К сожалению, у parquetjs есть строково-ориентированный писатель, но, по-видимому, работает итератор строк таблицы через писателя:

$ node index.js 
{ int: 0, str: 'foo' }
{ int: 1, str: 'bar' }
{ int: 2, str: 'baz' }

Оригинальный ответ:

Мынет поддержки для чтения или написания паркета в ArrowJS.Я не знаю зрелости реализаций паркетного узла, поэтому я еще не исследовал, какое взаимодействие возможно между ArrowJS и ParquetJS.

Пока что я решил, что это использовать pyarrowписать файлы паркета, когда это необходимо, обычно на границах, когда мы хотим читать или записывать в долговременное хранилище.Я понимаю, что это только решение, если вы можете позволить себе также поддерживать некоторые службы Python.

Если нет (и это относительно редкая операция, или вы можете позволить себе ждать, пока запускается интерпретатор Python), выможет быть немного забавным с динамическими языками, порождая дочерний процесс python из узла и передавая таблицы через pyarrow:

const duplexer = require('duplexer')
const { finished: eos } = require('stream')
const { spawn } = require('child_process')
const { RecordBatchWriter } = require('apache-arrow')

const writer = new RecordBatchWriter()
writer.writeAll(your_arrow_table()).close()
await eos(writer.pipe(to_parquet_file('out/file.parquet')))

function spawn_python_script(code) {
    const child = spawn('python', ['-c', code]);
    return duplexer(child.stdin, child.stdout);
}

function to_parquet_file(out_path) {
    return spawn_python_script(`
import sys
import pyarrow as pa
import pyarrow.parquet as pq

# read all the batches in from stdin
table = pa.RecordBatchStreamReader(sys.stdin.buffer).read_all()

# write table to the out_path
pq.write_table(table, '${out_path}')

sys.stdout.write('wrote table to \'${out_path}\')
sys.stdout.flush()
`)
}

Если вы сохраните скрипт python в файл и прочитаете путь из sys.argv[1], python будет запускаться немного быстрее (но все равно через секунду или две).

Я не знаком с библиотеками ORC, но я думаю, что есть какой-то паркет <->Преобразование ORC в одном из их API-интерфейсов Python.Я обнаружил, что, к сожалению, большинство из этих инструментов не существует в JS, или, если они есть, они зарождаются / заброшены (именно поэтому нам пришлось написать реализацию ArrowJS).

Обидно, потому чтоВ наши дни узел достаточно приличен при вводе / выводе, и достижение той же пропускной способности через python требует изрядного количества копаний в новейшие библиотеки asyncio / ASGI.Такие фреймворки, как Quart и Hypercorn , потрясающие, но, будучи настолько передовыми, может быть трудно найти ответы в Интернете, когда вы столкнетесь с проблемами [/rant].

...