在Hadoop中存储数据模式是否常见?

Bry*_*yle 6 hadoop hive apache-pig hdfs

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

例如,我将文件加载到HDFS中并希望使用Pig进行转换.为了有效地使用它,我需要在加载数据时指定文件的模式:

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

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

如果我想在Hive中使用相同的文件,我需要创建一个表并使用它来指定模式:

CREATE EXTERNAL TABLE EMP ( first_name string
                          , last_name string
                          , empno int)
LOCATION 'myfile';
Run Code Online (Sandbox Code Playgroud)

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

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

Cha*_*guy 3

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

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

例如,使用 Pig 你可以这样做:

EMP = LOAD 'myfile.avro' using AvroStorage();
Run Code Online (Sandbox Code Playgroud)

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

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