我正在向非常熟悉 Apache Parquet 二进制布局的人寻求建议:
F(a) = b进行完全确定性的数据转换F,并使用整个软件堆栈(框架、箭头和 parquet 库)的相同版本 -每次保存到 Parquet 中时,我在不同主机上获得相同的数据帧二进制表示的可能性有多大?bb
换句话说,Parquet 在二进制级别上的可重现性如何?当数据逻辑上相同时,什么会导致二进制差异?
我正在开发一个系统,用于完全可重现和确定性的数据处理和计算数据集哈希来断言这些保证。
我的主要目标是确保数据集b包含一组相同的记录作为数据集b'- 这当然与对 Arrow/Parquet 的二进制表示进行哈希处理非常不同。不想处理存储格式的可重复性,我一直在计算逻辑数据哈希。这是缓慢但灵活的,例如,即使记录被重新排序(我认为是等效的数据集),我的哈希值也保持不变。
但是,当考虑与依赖于文件哈希的IPFS其他内容可寻址存储集成时,只有一个哈希(物理)而不是两个(逻辑+物理)会大大简化设计,但这意味着我必须保证Parquet 文件是可复制的。
我决定暂时继续使用逻辑哈希。
我创建了一个新的 Rust 箱arrow-digest,它实现了 Arrow 数组和记录批次的稳定哈希,并努力隐藏与编码相关的差异。如果有人发现哈希算法有用并希望用另一种语言实现它,则该板条箱的自述文件描述了该算法。
当我将其集成到我正在开发的去中心化数据处理工具中时,我将继续扩展支持的类型集。
从长远来看,我不确定逻辑哈希是否是最好的前进方式 - Parquet 的一个子集,它牺牲了一些效率,只是为了使文件布局具有确定性,这可能是内容可寻址性的更好选择。