我有一个程序,它的输入应该是ORC文件格式。
我希望能够检查所提供的输入是否有效地是ORC文件。仅检查扩展名是不够的,因为用户可以省略该扩展名。
例如,对于Parquet,我们可以检查第一行是否包含";PAR1";。
ORC有类似的方法吗?
令人烦恼的是,它们有一个类似于带有魔术串ORC的镶木地板文件的东西,但它在文件的末尾。
https://orc.apache.org/specification/ORCv0/
在文件结束前完成一个字节是Postscript,Postscript的最后三个字节是ORC,所以你应该读取最后4个字节,它应该是ORC。
我会用一个十六进制编辑器来验证这一点!
如@Ed Elliott所述,ORC文件的尾部包含信息。ORC文件的最后一个字节之前的3个字节包含"0";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(。所以read不会遍历整个文件。