0

次の例で、同じ分類とタイプのサイズの合計を表示するにはどうすればよいですか?

((classification,Secret),(type,Document.Office),{((size,557856))}) ((classification,Secret),(type,Blog.ExternalPost),{((size,4478993))}) ((classification,Secret),(type,Social.Post.Twitter),{((size,1902045))}) ((classification,Secret),(type,Social.Post.Facebook),{((size,2085060)),((size,557856)),((size,1555956))}) ((classification,External),(type,Blog.ExternalPost),{((size,1902045))}) ((classification,External),(type,Blog.InternalPost),{((size,1438853))}) ((classification,External),(type,Social.Post.Facebook),{((size,1234311)),((size,4260972))})

これは、Pig の上記のリレーションの describe 関数からの出力です。

{classification: (name: chararray,value: chararray),type: (name: chararray,value: chararray),{(size: (name: chararray,value: int))}}

私は次のことを試しましたが、運がありません:

sum = foreach groupedfinal generate $0, $1, SUM($2);

エラー: org.apache.pig.builtin.SUM の一致する関数を推測できませんでした。複数またはいずれも適合しません。明示的なキャストを使用してください

どうぞよろしくお願いいたします。

ありがとうございます

4

1 に答える 1

1

ここにはいくつかの問題があります。まず、エラー メッセージ: これは、Pig がSUM計算対象の種類 (整数、浮動小数点数など) を判断できないことを示しています。入力SUMはバッグである必要があり、バッグ内の各タプルには合計される数値が含まれます。バッグ内の各タプルには別のタプルが含まれているため、これは機能しません。

これにより、2 番目の問題、つまりデータ編成の問題が発生します。classification意味的には、ここには 、type、およびs の3 つのフィールドしかありませんsize。ただし、これらの 3 つのフィールドをタプルにラップして格納し、フィールドの名前をchararray各タプルの最初の要素に として複製しています。これはスペースを浪費し、データの処理を非常に困難にします。

$2.sizeこれらの要素だけのバッグを取得するように、バッグのタプルの個々の要素を投影できます。しかし、あなたの場合、sizeバッグ内のそれぞれは数値ではなく、別のタプルであり、このタプルの要素にアクセスする方法がないため、これは何も変更しません。

FLATTENこれは、bag をFLATTENing してから tuple を ing してから re- ing することで回避できますがGROUP、最善の解決策は、さらに上流に目を向けてデータを再構築し、この種のネストや無駄なフィールド。

于 2013-10-02T15:03:05.727 に答える