6

我是 ORC 文件的新手。我浏览了很多博客,但没有得到清晰的理解。请帮助并澄清以下问题。

  1. 我可以从 ORC 文件中获取架构吗?我知道在 Avro 中,可以获取模式。

  2. 它实际上是如何提供模式演变的?我知道可以添加几列。但是怎么做。我唯一知道的是,创建 orc 文件是将数据加载到以 orc 格式存储数据的 hive 表中。

  3. ORC 文件索引如何工作?我所知道的是每个条带索引都会被维护。但是由于文件未排序,它如何帮助在条纹列表中查找数据。它如何帮助在查找数据时跳过条带?

  4. 是否为每一列维护索引。如果是,那么它不会消耗更多内存吗?

  5. 列格式 ORC 文件如何适合 hive 表,其中每列的值存储在一起。而 hive 表是按记录获取的。两者将如何结合在一起?

4

2 回答 2

4

1.2.使用 Hive 和/或 HCatalog 在 Hive 元存储中创建、读取、更新 ORC 表结构(HCatalog 只是一个侧门,而不是使 Pig/Sqoop/Spark/whatever 可以直接访问元存储)

2. ALTER TABLE命令允许添加/删除任何存储类型的列,包括 ORC。但要注意一个讨厌的错误,它可能会在此之后导致矢量化读取崩溃(至少在 V0.13 和 V0.14 中)

3.4.术语“索引”是相当不恰当的。基本上它只是在写入时保留在条带页脚中的最小/最大信息,然后在读取时用于跳过显然不符合WHERE要求的所有条带,在某些情况下大幅减少 I/O (在列中流行的技巧存储,例如 MySQL 上的 InfoBright,以及 Oracle Exadata 设备 [被 Oracle 营销称为“智能扫描”])

5. Hive 适用于“行存储”格式(Text、SequenceFile、AVRO)和“列存储”格式(ORC、Parquet)等。优化器只是在初始 Map 阶段使用特定的策略和快捷方式——例如条带消除、矢量化运算符——当然,列存储的序列化/反序列化阶段更复杂一些。

于 2015-08-10T20:59:12.537 回答
0

嘿,我无法帮助您解决所有问题,但我会尝试一下

  1. 您可以使用 filedump 实用程序来读取 ORC 文件的元数据,请参见此处

  2. 我对模式演化非常不确定,但据我所知 ORC 不支持演化。

  3. ORC 索引存储总和最小值和最大值,因此如果您的数据完全是非结构化的,您可能仍然需要读取大量数据。但是自从最新版本的 ORC 以来,您可以启用一个额外的 Bloom-Filter,它在行组消除方面更准确。也许这也有帮助orc-user mailing list

  4. ORC 为每一列提供一个索引,但它只是一个轻量级索引。您将有关 min/max 和 sum 的信息存储在 filefooter、stripefooter 中的数字列上,默认情况下每 10000 行存储一次。所以它不需要那么多空间

  5. 如果您将表存储在 Orc Fileformat 中,Hive 将使用特定的 ORC Recordreader 从列中提取行。列式存储的优点是您不必读取整行

于 2015-07-30T22:10:13.720 回答