我最近一直在做一些关于使用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中指定数据文件的模式,还是需要在每个应用程序中指定数据文件的模式?
答案 0 :(得分:3)
看起来你正在寻找Apache Avro。使用Avro,您的架构嵌入在您的数据中,因此您可以阅读它而无需担心架构问题,并且它使架构演变变得非常简单。
Avro的优点在于它完全集成在Hadoop中,您可以将它与许多Hadoop子项目(如Pig和Hive)一起使用。
例如,你可以做Pig:
EMP = LOAD 'myfile.avro' using AvroStorage();
我建议您查看the documentation for AvroStorage了解更多详情。
您也可以按照here所述使用Hro与Avro合作,但我没有亲自使用它,但它应该以相同的方式工作。
答案 1 :(得分:1)
您需要的是HCatalog
" Apache HCatalog是一种用于数据的表和存储管理服务 使用Apache Hadoop创建。
这包括:
- 提供共享架构和数据类型机制。
- 提供表抽象,以便用户无需关心何处或如何 他们的数据已存储。
- 提供跨猪,Map Reduce和Hive等数据处理工具的互操作性。"
您可以查看"data flow example" in the docs以查看您正在谈论的情景
答案 2 :(得分:0)
Apache Zebra似乎是可以在mr,pig和hive中提供通用模式定义的工具。它有自己的架构存储。 MR作业可以使用其内置的TableStore写入HDFS。