如何在JavaScript中创建ORC(或镶木地板)文件?

时间:2019-05-09 10:24:15

标签: javascript pyarrow apache-arrow

在服务器端javascript模块中,我需要将数据写入ORC文件,但找不到有关如何执行此操作的任何线索。理想情况下,我的模块还应该能够替代地写入镶木地板文件。对于ORC,我也将对如何在python中做到这一点感兴趣。

对于实木复合地板,我已经看到这是通过使用pyarrow library for Apache-Arrow在python中完成的。 Apache Arrow documentation声称同时支持ORC和Parquet文件格式。还有一个Apache Arrow node module,但是在他们的API reference中,我在ORC或镶木地板上找不到任何东西。

在这里,我找到了对parquetjsnode-parquet节点模块的引用,但对于ORC却没有任何引用。另外,如果可能的话,我更喜欢使用Apache Arrow。

有人对我有用吗?

1 个答案:

答案 0 :(得分:0)

更新

您的问题促使我将little proof-of-concept放在一起进行箭头-> parquetjs。不幸的是parquetjs有一个面向行的writer,但是通过writer传递表行迭代器似乎很好:

$ 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库不熟悉,但是我想他们的Python API之一中存在某种拼合<-> ORC转换。我发现不幸的是,这些工具大多数都不在JS中,或者如果存在,它们是新生的/被遗弃的(这就是为什么我们必须编写ArrowJS实现的原因)。

很遗憾,因为如今节点在I / O方面相当不错,而通过python实现相同的吞吐量需要大量挖掘最新的asyncio / ASGI库。诸如QuartHypercorn之类的框架非常棒,但是由于前沿性,当您遇到麻烦[/ rant]时可能很难在线找到答案。