PIG 中 Elephant-Bird UDF 中的 JSON 数组字段处理

Posted

技术标签:

【中文标题】PIG 中 Elephant-Bird UDF 中的 JSON 数组字段处理【英文标题】:JSON Array field handling in Elephant-Bird UDF in PIG 【发布时间】:2012-03-23 22:04:34 【问题描述】:

关于 PIG 中 JSON 处理的快速问题。

我尝试了一些名为 Elephant-Bird 的 JsonLoader 来加载和处理 JSON 数据,如下所示:


   "SV":1,
   "AD":[
      
         "ID":"46931606",
         "C1":"46",
         "C2":"469",
         "ST":"46931",
         "PO":1
      ,
      
         "ID":"46721489",
         "C1":"46",
         "C2":"467",
         "ST":"46721",
         "PO":5
      
   ]

加载器适用于简单字段,但不适用于任何数组字段。我不知道如何使用此 UDF 或以任何其他方式访问数组中的元素(上面的“AD”字段)?请指教。

【问题讨论】:

我创建了自己的 UDF 来专门处理这种情况(虽然不是通用方式),以防其他人遇到类似的需求。 你试过用点或散列来做吗?我记得使用其中一个从通过 Elephant Bird 加载的 json 数组中访问散列中的内容。 【参考方案1】:

你应该像这样使用 -nestedLoad 参数:

a = load 'input' using com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (json:map[]).

然后你使用下面的代码:

b = FOREACH a GENERATE (json#'AD') as AD:bagt:Tuple(m:map[]);

那么你的 json 数组就变成了 bag 数据类型。您可以将其展平以获得元组。

c = FOREACH b GENERATE FLATTEN(AD);
d = FOREACH c GENERATE AD::m#ID AS ID, AD::m#C1 AS C1, AD::m#C2 AS C2, AD::m#ST AS ST, AD::m#PO AS PO

此时会得到schema为(ID:bytearray, C)的元组数据类型

【讨论】:

【参考方案2】:

我认为数组部分与象鸟 JsonLoader 一起作为一个袋子返回。

我不知道这是否是正确的做法,但解决方法可能是展平 AD - 缺点是您现在将有多个行对应于数组 AD 中的每个元素。

【讨论】:

【参考方案3】:

正如其他人评论的那样,在加载过程中,数组变成了一个需要展平的包。为了使其自包含,下面是整个脚本的示例:

REGISTER elephant-bird-core-4.3.jar;
REGISTER elephant-bird-hadoop-compat-4.5.jar;
REGISTER elephant-bird-pig-4.5.jar;

DEFINE JsonLoader com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad=true');

records = LOAD '$DATA_PATH' USING JsonLoader() AS (data: map[]);
records = FOREACH records GENERATE 
                                data#'SV' AS SV,
                                FLATTEN(data#'AD') AS AD;
records = FOREACH records GENERATE
                                SV,
                                AD#'ID' AS ID,
                                AD#'C1' AS C1,
                                AD#'C2' AS C2,
                                AD#'ST' AS ST,
                                AD#'PO' AS PO;

【讨论】:

以上是关于PIG 中 Elephant-Bird UDF 中的 JSON 数组字段处理的主要内容,如果未能解决你的问题,请参考以下文章

Pig 的 UDF 中存在“in”会导致问题

在 PIG UDF 中调试

显示结果中的 Pig Udf

Pig 中 UDF 中 Jython 的限制

Pig:一类中有多个UDF

在 PIG 中执行 UDF 时出错