5

次のようなデータがあります。

(000001, mfp=621|mdus=4.0|mduc=5.0|mas=1|mpc=4.0|mfn=1|country=ABC)
(00002, address=1000+mity|mus=1|name=kailtig+bksyt|mas=1|mpc=4.977552|country=ABC)

フィールドは識別子と属性のセットです。

データ内のすべての属性を入力し、それらに対していくつかの操作を実行しようとしています。

そのため、次のようにスクリプトを準備しました。

A = load 'myData.txt' using PigStorage(',') as (ID, ATTRIBUTES);
B = foreach A generate FLATTEN(STRSPLIT(ATTRIBUTES, '\\|')) ;
C = foreach B generate FLATTEN(TOBAG(*));
Dump C;

()
( mfp=621)
(mdus=4.0)
(mduc=5.0)
(mas=1)
(mpc=4.0)
(mfn=1)
(country=ABC))
( address=1000+mity)
(mus=1)
(name=kailtig+bksyt)
(mpc=4.977552)

この時点まで、問題なく動作しています。しかし、問題はここから始まります。

これらの属性に対していくつかの操作を実行しようとすると、たとえば「m」を「market」に置き換えます

D = foreach C generate REPLACE($0,'m','market');

次のようなエラーが表示されます。

 Could not infer the matching function for org.apache.pig.builtin.REPLACE as 
 multiple or none of them fit. Please use an explicit cast.

bytearray を chararray にキャストしようとすると

D = foreach C generate (chararray)$0;

次のようなエラーが表示されます:

 ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1052:
 <line 4, column 24> Cannot cast bytearray to chararray

ただし、次のリンクhttp://pig.apache.org/docs/r0.11.1/basic.html#castは、piglatin が bytearray から chararray へのキャストをサポートしていることを示しています。

どうすればこの問題を解決できますか。助けてください。

ありがとう。

4

3 に答える 3

2

バイト配列を使用することが 100% 必要かどうかはわかりませんが、そうでない場合は次を使用できます。

A = LOAD 'myData.txt' USING PigStorage(',') AS (id, attrs) ; 
B = FOREACH A GENERATE FLATTEN(TOKENIZE(attrs, '|')) AS attr:chararray ;
-- Now that the data is loaded as chararrays REPLACE will work 
C = FOREACH B GENERATE REPLACE(attr,'m','market') AS attrchanged ;

そのため、attrs が分割されて平坦化されると、さらに chararray に変換されます。一般に、スキーマを使用して事前に型を宣言することをお勧めします。

各ステップのスキーマと出力は次のとおりです。

A: {id: bytearray,attrs: bytearray}
((000001, mfp=621|mdus=4.0|mduc=5.0|mas=1|mpc=4.0|mfn=1|country=ABC))
((00002, address=1000+mity|mus=1|name=kailtig+bksyt|mas=1|mpc=4.977552|country=ABC))
B: {attr: chararray}
( mfp=621)
(mdus=4.0)
(mduc=5.0)
(mas=1)
(mpc=4.0)
(mfn=1)
(country=ABC))
( address=1000+mity)
(mus=1)
(name=kailtig+bksyt)
(mas=1)
(mpc=4.977552)
(country=ABC))
C: {attrchanged: chararray}
( marketfp=621)
(marketdus=4.0)
(marketduc=5.0)
(marketas=1)
(marketpc=4.0)
(marketfn=1)
(country=ABC))
( address=1000+marketity)
(marketus=1)
(namarkete=kailtig+bksyt)
(marketas=1)
(marketpc=4.977552)
(country=ABC))
于 2013-06-28T20:43:06.780 に答える
0

DESCRIBE B で「Schema unknown」またはいずれかの列が NULL として返された場合、スキーマまたはデータ型が定義されていないことを意味します。bytearray の CAST に問題があるため、問題が発生します。したがって、STORE を使用してファイルを作成し、スキーマを使用して再度 LOAD すると、この問題を解決できる可能性があります。はい、オーバーヘッドです!

于 2014-10-16T11:59:31.977 に答える