检查文件是否为ORC文件。

3

我有一个需要输入ORC文件格式的程序。

我想要检查所提供的输入是否有效为ORC文件。仅通过扩展名来检查是不够的,因为用户可以省略扩展名。

例如对于Parquet,我们可以检查第一行是否包含"PAR1"。

那么,是否有类似于ORC的等效方式可以实现呢?


检查文件开头的十六进制位,看是否与所需的位匹配?在bash中也可以执行以下操作:cat file.orc | head -1 | grep 'PAR1' - Cyborg
2个回答

2
非常令人烦恼的是,他们与排列文件(parquet files)类似,有一种带有“ORC”魔术字符串的东西,但它在文件末尾。
请查看链接 https://orc.apache.org/specification/ORCv0/
在文件结束前一个字节处是Postscript(后缀),后缀的最后三个字节是ORC,因此您应该读取最后4个字节,其中应该包含"ORC"。
我建议使用十六进制编辑器来验证这一点!

2

正如@Ed Elliott所提到的那样,ORC文件在其尾部包含信息。在ORC文件的倒数第二个字节之前的3个字节包含“ORC”。以下是为我完成此操作的代码:

val mainPath = Paths.get(new URI(path)).toString
val buffer = ByteBuffer.allocate(3)
val channel = FileChannel.open(Paths.get(mainPath), StandardOpenOption.READ)
channel.read(buffer, channel.size - 4)
new String(buffer.array(), StandardCharsets.UTF_8).equals("ORC")

值得一提的是,如果要读取的字节数是固定的,那么这个读取操作的时间复杂度为O(1),也就是说,它不会遍历整个文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接