关于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”字段)?请给我建议。
发布于 2013-09-06 20:12:38
您应该像这样使用-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数组就变成了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此时,您将获得模式所属的元组数据类型(ID:bytearray,C)
发布于 2012-07-18 14:38:45
我认为数组部分作为一个包与象鸟JsonLoader一起返回。
我不知道这是否是正确的方法,但一个变通办法可能是扁平化AD -缺点是您现在将有多行对应于数组AD中的每个元素。
发布于 2015-03-27 05:49:35
正如其他人评论的那样,在加载过程中,array变成了一个需要压平的袋子。为了使其自包含,下面是整个脚本的示例:
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;https://stackoverflow.com/questions/9847058
复制相似问题