Обновление:
Ваш вопрос побудил меня собрать небольшое подтверждение концепции , чтобы сделать стрелку -> 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].