Apache PIG,JSON 加载器

Posted

技术标签:

【中文标题】Apache PIG,JSON 加载器【英文标题】:Apache PIG, JSON Loader 【发布时间】:2017-02-04 12:41:53 【问题描述】:

这是我的示例输入文件:

["disknum":36,"disksum":136.401,"disk_rate":1872.0,"disk_lnum": 13]
["disknum":36,"disksum":105.2,"disk_rate":123084.8,"disk_lnum": 13]

我正在尝试使用 PIG 中的 JsonLoader 解析此 JSON 数据,

这是我的脚本:

a = LOAD '/pig/tc.log' using JsonLoader ('disknum:chararray,disksum:chararray,disk_rate:chararray,disk_lnum:chararray');

b = FOREACH a GENERATE disknum,disksum,disk_rate,disk_lnum;

DUMP b;

预期输出:

36,136.401,1872.0,13

36,105.2,123084.8,13

实际输出:

( )

请帮帮我!我错过了什么?

【问题讨论】:

【参考方案1】:

注意文件中对象周围的 []。您可以将其加载到地图并访问字段或使用 ElephantBird jsonloader。

a = LOAD '/pig/tc.log' using JsonLoader(json:map[]);
b = FOREACH a GENERATE flatten(json#'disknum') AS disknum,
                       flatten(json#'disksum') AS disksum,
                       flatten(json#'disk_rate') AS disk_rate,
                       flatten(json#'disk_lnum') AS disk_lnum;      
DUMP b;

【讨论】:

感谢您的宝贵时间 :) 我在尝试 ELEPHANTBIRD JSON LOADER 时遇到错误,我已在下面的链接中发布,请您帮忙解决错误吗? ***.com/questions/42064795/… 使用 Elephantbird JsonLoader 如果记录采用以下格式,我可以加载数据:"disknum":36,"disksum":136.401,"disk_rate":1872.0,"disk_lnum": 13 我的数据格式为:"disknum":36,"disksum":136.401,"disk_rate":1872.0,"disk_lnum": 13,"tags":["tag1", "tag2", "tag3"]。知道如何加载吗?【参考方案2】:

您的输入数据是 JSON 数组,这就是 Pig 的 JsonLoader 无法读取它的原因。 如果可能,删除数组(如下所示)或查看Load JSON array into Pig。你应该能弄清楚基本原理。

"disknum":36,"disksum":136.401,"disk_rate":1872.0,"disk_lnum": 13
"disknum":36,"disksum":105.2,"disk_rate":123084.8,"disk_lnum": 13

【讨论】:

以上是关于Apache PIG,JSON 加载器的主要内容,如果未能解决你的问题,请参考以下文章

Pig 错误:无法找到或加载主类 org.apache.pig.Main

使用 Apache PIG 读取多行 JSON

如何使用 apache pig 递归加载文件

Apache Pig 中的 HCatalog 可以只加载特定分区吗?

如何使用 apache pig 在 hadoop 集群上加载文件?

Apache Pig 将整个关系加载到 UDF