我最近一直在做一些关于使用 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 中指定数据文件的模式,还是我需要在每个应用程序中指定数据文件的模式?