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 では、この辞書が変換されるマップに [] を使用するためです。
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 では、この辞書が変換されるマップに [] を使用するためです。
標準の 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 を使用することを強くお勧めします。学習曲線はもう少し急勾配になる可能性がありますが、それを超えると、開発ははるかに速くなり、プログラムのスループットも向上します.