6

我最近一直在做一些关于使用 Hadoop、Hive 和 Pig 进行数据转换的调查。作为其中的一部分,我注意到数据文件的架构似乎根本没有附加到文件中。数据文件只是平面文件(除非使用 SequenceFile 之类的文件)。每个想要使用这些文件的应用程序都有自己的方式来表示这些文件的架构。

例如,我将一个文件加载到 HDFS 并想用 Pig 转换它。为了有效地使用它,我需要在加载数据时指定文件的架构:

EMP = LOAD 'myfile' using PigStorage() as { first_name: string, last_name: string, deptno: int};

现在,我知道在使用 PigStorage存储文件时,可以选择将模式与它一起写出,但是为了首先将文件放入 Pig,似乎您需要指定模式。

如果我想在 Hive 中使用同一个文件,我需要创建一个表并使用它指定架构:

CREATE EXTERNAL TABLE EMP ( first_name string
                          , last_name string
                          , empno int)
LOCATION 'myfile';

在我看来,这是非常脆弱的。如果文件格式发生轻微变化,则必须在每个应用程序中手动更新架构。我确定我很天真,但是将架构与数据文件一起存储是否有意义?这样,数据可以在应用程序之间移植,并且使用其他工具的障碍会更低,因为您不需要为每个应用程序重新编码模式。

所以问题是:有没有办法在 Hadoop/HDFS 中指定数据文件的模式,还是我需要在每个应用程序中指定数据文件的模式?

4

3 回答 3

3

看起来您正在寻找Apache Avro。使用 Avro,您的架构嵌入到您的数据中,因此您可以阅读它而不必担心架构问题,并且它使架构演变非常容易。

Avro 的伟大之处在于它完全集成在 Hadoop 中,您可以将它与许多 Hadoop 子项目(如 Pig 和 Hive)一起使用。

例如,您可以使用 Pig:

EMP = LOAD 'myfile.avro' using AvroStorage();

我建议查看AvroStorage 的文档以获取更多详细信息。

您也可以按照此处所述将 Avro 与 Hive 一起使用,但我个人没有使用过,但它应该以相同的方式工作。

于 2013-05-30T17:55:24.280 回答
1

您需要的是HCatalog,它是

“Apache HCatalog 是一种用于使用 Apache Hadoop 创建的数据的表和存储管理服务。

这包括:

  • 提供共享模式和数据类型机制。
  • 提供表抽象,以便用户不必关心他们的数据存储在哪里或如何存储。
  • 提供跨数据处理工具(如 Pig、Map Reduce 和 Hive)的互操作性。”

您可以查看文档中的“数据流示例”以准确了解您正在谈论的场景

于 2013-06-01T12:34:11.593 回答
0

Apache Zebra似乎是可以跨 mr、pig 和 hive 提供通用模式定义的工具。它有自己的模式存储。MR 作业可以使用其内置的 TableStore 写入 HDFS。

于 2013-06-01T04:33:10.210 回答