如何使用 Pig 检查 JSON 中缺少的密钥?

Posted

技术标签:

【中文标题】如何使用 Pig 检查 JSON 中缺少的密钥?【英文标题】:How to check for missing Key in JSON using Pig? 【发布时间】:2016-02-27 19:13:44 【问题描述】:

我有一个具有不同架构的 JSON 文件。

"asin":"xxxxxx", "title":"xxxsomething"
"asin":"yyyyy"
"asin":"zzzzzz", "title":"zzzsomething"

为此,我编写了一个 pig 脚本,该脚本利用 twitter's elephant-bird 库来加载 JSON 数据并将其转换为制表符分隔的文件。

但是,如果输入 JSON 文件中的一行缺少“title”键(上例中的第 2 行),则 tvs 文件也没有任何内容可以代替它,例如:

xxxxxx  xxxsomething
yyyyyy  
zzzzzz  zzzsomething

如果缺少特定键,我想提供自定义默认值。如何使用 PigLatin 做到这一点?

预期输出:

xxxxxx  xxxsomething
yyyyyy  default_string
zzzzzz  zzzsomething

这是我的脚本:

REGISTER elephant-bird-elephant-bird-4.13/pig/target/elephant-bird-pig-4.13.jar;
REGISTER elephant-bird-elephant-bird-4.13/hadoop-compat/target/elephant-bird-hadoop-compat-4.13.jar;
REGISTER elephant-bird-elephant-bird-4.13/core/target/elephant-bird-core-4.13-thrift9.jar;

reviews = load '../data/Amazon/meta_Amazon_Instant_Video.json'
          using com.twitter.elephantbird.pig.load.JsonLoader();

tabs = FOREACH reviews generate (chararray)$0#'asin' as asin_new, (chararray)$0#'title';

A = ORDER tabs BY asin_new;
DESCRIBE A;

STORE A INTO 'hdfs://localhost:9000/meta_Amazon_Instant_Video.tsv';

【问题讨论】:

【参考方案1】:

您可以简单地为此编写一个 UDF 并设置条件,如果其中任何一个为空,则传递默认字符串。

【讨论】:

这个怎么样:((((chararray)$0#'title') IS NULL) ? '<null>' : (chararray)$0#'title')

以上是关于如何使用 Pig 检查 JSON 中缺少的密钥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中解析复杂的 JSON 字符串

如何从 iOS Swift Codable 中的 API 响应通知或打印模型类上缺少的密钥?

使用 PL/pgSQL 检查密钥是不是存在于 JSON 中?

pig 新手,如何使用 pig 中的键值对子集将 JSON 转换为另一个 JSON?

如何解码来自列的 Pig 中的 JSON?

将 json 文件加载到 PIG 中