【问题标题】:check if a file is an ORC file检查文件是否为 ORC 文件
【发布时间】:2020-12-27 00:30:21
【问题描述】:

我有一个程序,其输入应为 ORC 文件格式。

我希望能够检查提供的输入是否有效地是一个 ORC 文件。仅检查扩展名是不够的,因为用户可以省略扩展名。

以 Parquet 为例,如果第一行包含“PAR1”,我们可以check

ORC 有没有等价的方法?

【问题讨论】:

  • 检查文件开头的必要十六进制位?看看 BITs 是否符合您的要求?在 bash 中也可以这样做:cat file.orc | head -1 | grep 'PAR1'

标签: scala apache-spark parquet orc


【解决方案1】:

正如@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)。所以 read 不会遍历整个文件。

【讨论】:

    【解决方案2】:

    令人讨厌的是,它们与带有魔术字符串 ORC 的 parquet 文件类似,但它位于文件的末尾。

    https://orc.apache.org/specification/ORCv0/

    文件结束前的一个字节是Postscript,Postscript的最后三个字节是ORC,所以你应该阅读最后四个字节,应该是ORC的东西。

    我会使用十六进制编辑器来验证这一点!

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2011-01-25
      • 1970-01-01
      • 2011-05-03
      • 2011-01-12
      相关资源
      最近更新 更多