8

Apache PIG を使用しているときに Python UDF から辞書を返すための出力スキーマは何ですか。

次のような辞書の辞書があります。

dict = {x:{a:1,b:2,c:3}, y:{d:1,e:3,f:9}}

私の出力スキーマは次のようになります

@outputSchema("m:map[im:map[X:float,Y:float]]") 

** 角括弧は、Pig では、この辞書が変換されるマップに [] を使用するためです。

4

1 に答える 1

4

標準の jython UDF を使用していて、mortar data が提供する streaming_python などの他のディストリビューションを使用していない場合、必要な作業は次のとおりです。

@outputSchema('m:map[]') 

キーは、Python で設定したものと同じになります。dict 内に別の辞書がある場合は、心配する必要はありません。pig はそれを理解し、次の構文を使用します。

([first#{third=inner_dict},first#outter_dict])

jython UDF から pig に dict を戻すことには大きな欠点が 1 つあります。dict のすべての値に対して 1 つのデータ型しか設定できません。つまり、データ型を設定しない場合、pig は bytearray をデータ型として使用します。これは、日付や複雑な構造を扱うときに問題になる可能性があります。例えば:

@outputSchema('m:map[chararray]')

タプルとバッグ:

タプルまたはバッグを jython UDF から pig に戻したい場合、python のリストはバッグに変換され、タプルはタプルに変換されることを覚えておくと便利です。例えば:

リスト:

@outputSchema('m:bag{chararray}')

Pig バッグはタプルで満たされていることを思い出してください。したがって、バッグに適切な構造を設定したい場合は、バッグ内でタプルを宣言することができ、そこで渡すすべてのデータ型を設定できます。例:

@outputSchema('map_reduce:bag{t:(key:chararray,value:int,start_date:datetime,end_date:datetime)}')

最後に、タプルはある程度直感的である必要があります。タプルは、jython を使用する場合に使用する最も簡単な構造です。タプル内では、上記の例に従っている限り、必要な数のフィールドと必要な数のレベルを設定できます。タプル内でタプルを宣言したり、バッグやその他の値を持つタプルなどを宣言したりできます。

複雑な操作を実行したり、JSON 構造、配列、リストなどの複雑なデータ型を操作したりする場合は、Java UDF を使用することを強くお勧めします。学習曲線はもう少し急勾配になる可能性がありますが、それを超えると、開発ははるかに速くなり、プログラムのスループットも向上します.

于 2014-12-03T14:45:05.483 に答える