JS apache-arrow的tableFromIPC支持的压缩方式及读取报错咨询
问题描述
我通过本地、谷歌云存储或S3等文件系统,在Web前端(JS)与后端(Python)之间交换Arrow IPC格式数据。
后端Python写入代码如下:
with self.file_system.open_output_stream(f'{self.bucket}/{file_name}') as sink: with ipc.new_file(sink, schema=table.schema, options=ipc.IpcWriteOptions(compression='lz4')) as writer: writer.write(table) sink.flush()
前端使用apache-arrow包的tableFromIPC读取时,无法识别LZ4或ZSTD压缩的文件,前端代码:
import { readFileSync } from 'fs'; import { tableFromIPC } from 'apache-arrow'; const arrow = readFileSync('xx.arrow'); const table = tableFromIPC(arrow); console.table(table.toArray());
运行后报错:
Uncaught (in promise) Error: Record batch compression not implemented
我在JS包文档中未找到默认读取格式或自定义配置选项的相关说明,请问该如何解决?
解决方案
方案1:后端禁用压缩(最简单直接)
修改Python代码,移除压缩配置,生成无压缩的Arrow IPC文件,前端即可正常读取:
with self.file_system.open_output_stream(f'{self.bucket}/{file_name}') as sink: # 去掉compression参数,或显式设置为None with ipc.new_file(sink, schema=table.schema, options=ipc.IpcWriteOptions(compression=None)) as writer: writer.write(table) sink.flush()
方案2:前端添加压缩解码器支持
JS版apache-arrow默认未内置LZ4/ZSTD的解码器,需要手动引入对应压缩库并注册:
以LZ4为例:
- 安装LZ4依赖:
npm install lz4js
- 修改前端代码,注册解码器后再读取文件:
import { readFileSync } from 'fs'; import { tableFromIPC, registerCompression } from 'apache-arrow'; import { decompress } from 'lz4js'; // 注册LZ4解码器 registerCompression('lz4', { decompress: (buffer) => decompress(new Uint8Array(buffer)) }); const arrow = readFileSync('xx.arrow'); const table = tableFromIPC(arrow); console.table(table.toArray());
若使用ZSTD:
安装zstd-js依赖后,同理注册ZSTD解码器:
npm install zstd-js
import { decompress } from 'zstd-js'; registerCompression('zstd', { decompress: (buffer) => decompress(new Uint8Array(buffer)) });
方案3:中间层转码(兼容现有后端输出)
如果无法修改后端代码,也不想调整前端依赖,可以在后端或新增中间服务,将压缩的Arrow文件转换为无压缩格式后再提供给前端;或者前端下载文件后,先手动调用压缩库解压,再将解压后的二进制数据传给tableFromIPC。
内容的提问来源于stack exchange,提问作者Yan Yang
相关产品推荐
相关产品推荐

