【问题标题】:How to create ORC (or parquet) files in javascript?如何在 javascript 中创建 ORC(或 parquet)文件?
【发布时间】:2019-09-27 03:59:41
【问题描述】:

在服务器端 javascript 模块中,我需要将数据写入 ORC 文件,但找不到有关如何执行此操作的任何线索。理想情况下,我的模块也应该能够写入 parquet 文件。对于 ORC 案例,我也对如何在 python 中执行此操作感兴趣。

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

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

有人给我指点吗?

【问题讨论】:

    标签: javascript pyarrow apache-arrow


    【解决方案1】:

    更新:

    您的问题促使我将little proof-of-concept 放在一起做箭头-> parquetjs。不幸的是 parquetjs 有一个面向行的编写器,但是通过编写器管道表行迭代器似乎工作正常:

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

    原答案:

    我们不支持在 ArrowJS 中读取或写入 parquet。我不知道 node parquet 实现的成熟度,所以我还没有探索 ArrowJS 和 ParquetJS 之间可能存在什么样的互操作。

    到目前为止,我解决此问题的方法是在必要时使用 pyarrow 写入 parquet 文件,通常在我们想要读取或写入长期存储的边界处。我意识到这只是一个解决方案,如果你能负担得起一些 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 中有某种 parquet ORC 转换。我发现不幸的是,这些工具中的大多数都不存在于 JS 中,或者即使它们存在,它们也是新生/废弃的(这就是我们必须编写 ArrowJS 实现的原因)。

    很遗憾,因为如今 node 在 i/o 方面相当不错,并且通过 python 实现相同的吞吐量需要大量挖掘最新的asyncio/ASGI 库。像 QuartHypercorn 这样的框架非常棒,但是当你遇到问题时,它是如此的前沿以至于很难在网上找到答案 [/rant]。

    【讨论】:

    • 感谢您的详细解答!我 gahter ORC 或 parquet 集成目前还没有真正用于 Apache ArrowJS 的工作?由于我的问题的主要焦点是 ORC,我还没有将其设置为最有帮助的答案,尽管它最终可能会成为那个... :-)
    猜你喜欢
    • 2017-11-30
    • 2019-05-07
    • 2014-02-16
    • 2017-08-07
    • 2018-07-31
    • 2020-05-10
    • 2020-11-28
    • 2015-11-29
    • 2022-01-17
    相关资源
    最近更新 更多