无法使用Pig中的Elephant Bird访问带有包和元组的嵌套JSON

时间:2016-03-15 16:18:06

标签: json hadoop nested apache-pig elephantbird

我正在尝试使用Pig中的Elephant Bird来解析嵌套的JSON对象,其级别可以包含行包和/或元组。在第四级引用列会导致一些奇怪的行为。

引用第四列及以下列时,Pig出现问题。似乎因为数据在包,元组和地图之间有一些交替。为了清楚起见,看起来JsonLoader将一些转换为地图,但其他人则没有。例如,请参阅下面“五”的引用。

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

我应该如何引用五级和六级?我的最终目标是能够引用eight_ideight_score并展平seven数组/包的元素

1 个答案:

答案 0 :(得分:-1)

尝试使用

c = FOREACH b GENERATE FLATTEN(three);
d = FOREACH c GENERATE three::four#five AS five;