json数组字段处理

8wtpewkr  于 2021-06-21  发布在  Pig
关注(0)|答案(3)|浏览(417)

一个关于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
      }
   ]
}

加载器对于简单字段工作得很好,但是对于任何数组字段都不工作。我不知道如何使用这个自定义项或以任何其他方式访问数组中的元素(上面的“ad”字段)?请告知。

1aaf6o9v

1aaf6o9v1#

您应该像这样使用-nestedload参数:

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

然后使用以下代码:

b = FOREACH a GENERATE (json#'AD') as AD:bag{t:Tuple(m:map[])};

然后你的json数组变成一个包数据类型。你可以把它展平得到元组。

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

此时,您将获得模式所属的元组数据类型(id:bytearray,c)

xoefb8l8

xoefb8l82#

我认为数组部分会作为一个包返回给象鸟jsonloader。
我不知道这是否是正确的方法,但一个解决办法可能是平坦的广告-缺点是你现在将有多行对应的数组广告中的每个元素。

pjngdqdw

pjngdqdw3#

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

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;

相关问题