木马
完全同步 TypeScript 执行 Parquet 文件格式
此软件包来源于 帕尔克特.js,包含一个完全同步的 脚本类型执行 公园 文件格式。 执行情况符合 与 Parquet 规格 正在测试中 与 Apache 兼容 参考执行。 。 。 .
警告数字 : 与参考执行存在兼容性问题数字 :
- 只有GZIP和SNAPPY压缩兼容
- 平板工具 是帮助检查 Parquet 文件的命令行工具.
- 总是验证您装有现实数据样本的表格结构可以被Parquet Tools读取!
帕尔克是什么?: Parquet 是一个面向列的文件格式; 它允许您使用 将大量结构化数据写入文件, 压缩后读取部分 高效地退后. Parquet 格式基于 谷歌的德雷梅尔纸。 。 。 .
安装
要使用带节点的parquet.js,请使用npm安装:
$ npm install parquets
parquets 需要节点.js\ 7.6.0
用法: 写入文件
一旦您安装了 parquets 库, 您可以将它作为单个导入 模块 :
import { ParquetSchema, ParquetWriter, ParquetReader } from 'parquets';
Parquet文件有严格的计划,类似于SQL数据库中的表格. 这么说吧,
为了制作Parquet文件 我们首先需要宣布一个新的计划 给
是一个简单的例子,可以显示如何将 ParquetSchema 对象 :
// declare a schema for the `fruits` table
let schema = new ParquetSchema({
name: { type: 'UTF8' },
quantity: { type: 'INT64' },
price: { type: 'DOUBLE' },
date: { type: 'TIMESTAMP_MILLIS' },
in_stock: { type: 'BOOLEAN' }
});
请注意, Parquet 计划支持筑巢, 所以你可以储存复杂,任意 将记录嵌入一行(较后),同时保持良好 压缩.
一旦我们有一个计划, 我们可以创建一个 ParquetWriter 对象。 作家会的
将输入行作为 JSON 对象,将其转换为 Parquet 格式并存储
它们在磁盘上.
// create new ParquetWriter that writes to 'fruits.parquet`
let writer = await ParquetWriter.openFile(schema, 'fruits.parquet');
// append a few rows to the file
await writer.appendRow({name: 'apples', quantity: 10, price: 2.5, date: new Date(), in_stock: true});
await writer.appendRow({name: 'oranges', quantity: 10, price: 2.5, date: new Date(), in_stock: true});
完成文件添加行后,必须告诉撰写对象
通过调用 close() 方法 :
用法: 读取文件
一个parquet读取器可以按顺序从parquet文件中取回行. 基本用途是创建读取器,然后取回光标/绘图器 它允许您逐行消费,直到所有行被读取.
您可打开多个光标并同时使用 。 所有光标变为 关闭时无效 () 调用 读者反对.
// create new ParquetReader that reads from 'fruits.parquet`
let reader = await ParquetReader.openFile('fruits.parquet');
// create a new cursor
let cursor = reader.getCursor();
// read all records from the file and print them
let record = null;
while (record = await cursor.next()) {
console.log(record);
}
创建光标时,您可以选择只请求一个子集 栏应从磁盘中读取。 例如:
// create a new cursor that will only return the `name` and `price` columns
let cursor = reader.getCursor(['name', 'price']);
在读完文件后, 您必须关闭此文件 避免泄露文件描述符.
await reader.close();
编码
内部, Parquet 格式将连续存储每个字段的值 可用若干方案压缩/编码的数组.
普通编码( PLAIN)
最简单的编码方案是PLAIN编码. 它只是储存
值是没有压缩的。 PLAIN 编码目前
所有类型的默认值除外 BOOLEAN数字 :
let schema = new ParquetSchema({
name: { type: 'UTF8', encoding: 'PLAIN' },
});
运行长度编码( RLE)
Parquet 混合运行长度和位包编码允许压缩运行
数字非常高效。 注意 RLE 编码只能用于
结合 BOOLEAN, (中文(简体) ), INT32 财务报告和审定财务报表 INT64 类型。 RLE 编码
需要额外 bitWidth 包含最大数量
存储字段最大值所需的比特.
let schema = new ParquetSchema({
age: { type: 'UINT_32', encoding: 'RLE', bitWidth: 7 },
});
可选字段
默认情况下,所有字段都需要出现在每行中. 也可以标注 一个字段作为“ 可选的” 字段, 允许您存储缺少该字段的行 :
let schema = new ParquetSchema({
name: { type: 'UTF8' },
quantity: { type: 'INT64', optional: true },
});
let writer = await ParquetWriter.openFile(schema, 'fruits.parquet');
await writer.appendRow({name: 'apples', quantity: 10 });
await writer.appendRow({name: 'banana' }); // not in stock
嵌入式行和矩阵
Parquet 支持嵌入式计划,允许您存储更多行
复杂结构,而不是简单的平分值。 宣布一个计划
以嵌入地取出 type 在栏定义中添加 fields
列表改为:
举个例子,让我们可以储存一个更先进的"水果"表 其中每行包含名称、颜色列表和“库存”对象列表.
// advanced fruits table
let schema = new ParquetSchema({
name: { type: 'UTF8' },
colours: { type: 'UTF8', repeated: true },
stock: {
repeated: true,
fields: {
price: { type: 'DOUBLE' },
quantity: { type: 'INT64' },
}
}
});
// the above schema allows us to store the following rows:
let writer = await ParquetWriter.openFile(schema, 'fruits.parquet');
await writer.appendRow({
name: 'banana',
colours: ['yellow'],
stock: [
{ price: 2.45, quantity: 16 },
{ price: 2.60, quantity: 420 }
]
});
await writer.appendRow({
name: 'apple',
colours: ['red', 'green'],
stock: [
{ price: 1.20, quantity: 42 },
{ price: 1.30, quantity: 230 }
]
});
await writer.close();
// reading nested rows with a list of explicit columns
let reader = await ParquetReader.openFile('fruits.parquet');
let cursor = reader.getCursor([['name'], ['stock', 'price']]);
let record = null;
while (record = await cursor.next()) {
console.log(record);
}
await reader.close();
可能并不明显,为什么人们想要实施或使用这种特征,如果 原则上也可以通过使用JSON对记录进行序列化来实现 (或类似方案)然后存储到UTF8字段:
把关于严格打字的优点的哲学讨论放在一边, 了解所有记录的结构和子类型(全球)意味着我们不 每个记录都必须复制此元数据(即字段名称)。 在顶上 其中,知道一个字段的类型 使我们能够压缩剩下的 数据效率更高.
支持类型和编码列表
我们的目标是完成特色并增加新的功能,因为这些功能被添加到 Parquet 规格; 这是当前已执行的数据类型列表 编码 :
| 逻辑类型 | 初级类型 | 编码 |
|---|---|---|
| UTF8 主题 | BYTE 阿雷 | 诗 |
| 贾森 | BYTE 阿雷 | 诗 |
| 贝森 | BYTE 阿雷 | 诗 |
| BYTE 阿雷 | BYTE 阿雷 | 诗 |
| 时间( M) | INT32号 | 倒车,倒车 |
| 时间( M) | INT64 (英语) | 倒车,倒车 |
| 时光倒流 | INT64 (英语) | 倒车,倒车 |
| 时号( M) | INT64 (英语) | 倒车,倒车 |
| 玻利维亚 | 玻利维亚 | 倒车,倒车 |
| 浮图 | 浮图 | 诗 |
| 丢弃 | 丢弃 | 诗 |
| INT32号 | INT32号 | 倒车,倒车 |
| INT64 (英语) | INT64 (英语) | 倒车,倒车 |
| INT96号楼 | INT96号楼 | 诗 |
| INT 8 (中文(简体) ) | INT32号 | 倒车,倒车 |
| INT 16 请检查URL=值 (帮助) | INT32号 | 倒车,倒车 |
| INT 32 (英语) | INT32号 | 倒车,倒车 |
| 64国道 | INT64 (英语) | 倒车,倒车 |
| 无效 8 | INT32号 | 倒车,倒车 |
| UINT 16 请检查URL=值 (帮助) | INT32号 | 倒车,倒车 |
| UINT 32 请检查DATE=中的日期值 (帮助) | INT32号 | 倒车,倒车 |
| UINT 64 (中文(简体) ) | INT64 (英语) | 倒车,倒车 |
缓冲行组大小( R)
当写入 Parquet 文件时 ParquetWriter 将在内存中缓冲行
直到一行组完成(或 close() 然后写出行
组合到磁盘.
用户可配置行组的大小并控制最大值 任何特定时间在内存中缓冲的行数以及行数 磁盘上同一位置的行:
let writer = await ParquetWriter.openFile(schema, 'fruits.parquet');
writer.setRowGroupSize(8192);
依赖关系
平板用途 节俭 以编码图案和其他 元数据,但实际数据不使用节俭.
捐款
请确保你签署 缴款许可证协议 为了我们能接受你的贡献 我们非常感谢你!
许可证
parquet.js 版权 (c) 2017铁源有限公司.
特此免费准许任何人获得《公约》副本 此软件和相关文档文件( “软件” ), 可在 软件不受限制,包括不受限制的使用权, 复制、修改、合并、出版、分发、分许可和/或出售 软件,并允许获得软件的人这样做, 符合下列条件:
上述版权通知和这项许可通知应载入所有 软件的复制件或大部分.
软件是提供的"AS IS", 没有任何种类的恐惧, 释放或渗透, 包括但不限制于雇佣军的保障 特别是目的和非目的。 绝对不能让警察或警察 对于任何索赔、索赔或其他索赔 转让、转让或其他合同的产生、产生或涉及 软件或软件的使用或其他交易.