最近、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 でデータ ファイルのスキーマを指定する方法はありますか、それとも各アプリケーションでデータ ファイルのスキーマを指定する必要があるかということです。