我最近一直在研究如何使用hadoop、hive和pig进行数据转换。作为其中的一部分,我注意到数据文件的模式似乎根本没有附加到文件中。数据文件只是平面文件(除非使用类似sequencefile的文件)。每个想要处理这些文件的应用程序都有自己的方式来表示这些文件的模式。
例如,我将一个文件加载到hdfs中,并希望使用pig对其进行转换。为了有效地使用它,我需要在加载数据时指定文件的架构:
EMP = LOAD 'myfile' using PigStorage() as { first_name: string, last_name: string, deptno: int};
现在,我知道在使用pigstorage存储文件时,可以选择将模式写入pig,但是为了首先将文件放入pig,似乎需要指定一个模式。
如果我想在配置单元中使用同一个文件,我需要创建一个表并用它指定模式:
CREATE EXTERNAL TABLE EMP ( first_name string
, last_name string
, empno int)
LOCATION 'myfile';
在我看来这是非常脆弱的。如果文件格式发生了细微的变化,则必须在每个应用程序中手动更新模式。我肯定我太天真了,但是将模式与数据文件一起存储难道没有意义吗?这样,数据在应用程序之间是可移植的,使用另一个工具的障碍会降低,因为您不需要为每个应用程序重新编写模式。
所以问题是:有没有一种方法可以在hadoop/hdfs中指定数据文件的模式,或者我需要为每个应用程序中的数据文件指定模式?
3条答案
按热度按时间9lowa7mx1#
看起来你在找Apache·阿夫罗。使用avro,您的模式被嵌入到数据中,因此您可以读取它,而不必担心模式问题,这使得模式演化非常容易。
avro最大的优点是它完全集成在hadoop中,您可以将它与许多hadoop子项目(如pig和hive)结合使用。
例如,对于pig,您可以执行以下操作:
我建议查看avrostorage的文档以了解更多详细信息。
你也可以像这里描述的那样使用avro和hive,但是我个人没有使用过,但是它应该以同样的方式工作。
mhd8tkvw2#
你需要的是hcatalog
“ApacheHcatalog是一种用于使用ApacheHadoop创建的数据的表和存储管理服务。
这包括:
提供共享模式和数据类型机制。
提供一个表抽象,这样用户就不必关心数据存储的位置或方式。
提供跨数据处理工具(如pig、map reduce和hive)的互操作性。”
您可以查看文档中的“数据流示例”,以确切地了解您所讨论的场景
f1tvaqid3#
apachezebra似乎是可以跨mr、pig和hive提供公共模式定义的工具。它有自己的模式存储。mrjob可以使用其内置的表存储来写入hdfs。