0

Pig で Elephant Bird を使用して、レベルにバッグやタプルを含めることができるネストされた JSON オブジェクトを解析しようとしています。第 4 レベルで列を参照すると、奇妙な動作が発生します。

Pig では、4 番目以下の列を参照するときに問題が発生します。データがバッグ、タプル、マップを交互に行っているためと思われます。明確にするために、JsonLoader は一部をマップに変換するように見えますが、他は変換しません。たとえば、以下の「5」の参照を参照してください。

HDP バージョン: 2.1.2、豚バージョン: 0.12.1、象鳥バージョン: 4.13

これは、キーと値がプレースホルダーに置き換えられた構造のサンプル データです。

   {
        "one" : {
            "output_info" : {
                "sample_key": "sample value"
            },
            "two" : {
                "three" : [{
                    "three_id" : "three_id_value",
                    "four" : {
                        "five" : [{
                                "level_five_info" : {
                                    "five_info_key" : "five_info_value"
                                },
                                "six" : {
                                    "seven" : [{
                                            "eight_id" : "123545",
                                            "eight_score" : "77"
                                        }, {
                                            "eight_id" : "98765",
                                            "eight_score" : "88"
                                        }
                                    ]
                                }
                            } 
                        ]
                    }
                }]
            }
        }
    }

豚の声明:

a = LOAD 'nest_test.dat' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (json:map[]);

b = foreach a generate json#'one'#'two'#'three' as (three: {(three_id: chararray,four: map[])});

実行すると、次のdump b;結果が得られます。

({([three_id#three_id_value,four#{five={([six#{seven={([eight_score#77,eight_id#123545]),([eight_score#88,eight_id#98765])}},level_five_info#{five_info_key=five_info_value}])}}])})

ただし、これはすべて期待どおりに見えます。

c = foreach b generate three.four as ({(four:map[])});

しかし、現在、実行dump c;しても上記のデータは返されません。

({()})

スキーマの記述を省略する場合も同様です

c = foreach b generate three.four

より深いレベルを参照すると、エラーが発生します。

d = foreach b generate three.four#'five';

2016-03-15 11:56:01,655 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1052: Cannot cast bag with schema :bag{:tuple(four:map)} to map with schema :map

レベル 5 と 6 をどのように参照すればよいですか? 私の最終的な目標は、配列/バッグの要素を参照eight_ideight_scoreてフラット化できるようにすることですseven

4

1 に答える 1

-1

使ってみて

c = FOREACH b GENERATE FLATTEN(three);
d = FOREACH c GENERATE three::four#five AS five;
于 2016-03-15T19:46:29.073 に答える