我有一个需要输入ORC文件格式的程序。
我想要检查所提供的输入是否有效为ORC文件。仅通过扩展名来检查是不够的,因为用户可以省略扩展名。
例如对于Parquet,我们可以检查第一行是否包含"PAR1"。
那么,是否有类似于ORC的等效方式可以实现呢?
我有一个需要输入ORC文件格式的程序。
我想要检查所提供的输入是否有效为ORC文件。仅通过扩展名来检查是不够的,因为用户可以省略扩展名。
例如对于Parquet,我们可以检查第一行是否包含"PAR1"。
那么,是否有类似于ORC的等效方式可以实现呢?
正如@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),也就是说,它不会遍历整个文件。
cat file.orc | head -1 | grep 'PAR1'
- Cyborg