如何在 Pig Latin 中每行加载一个带有 JSON 数组的文件

Posted

技术标签:

【中文标题】如何在 Pig Latin 中每行加载一个带有 JSON 数组的文件【英文标题】:How to load a file with a JSON array per line in Pig Latin 【发布时间】:2013-11-08 16:12:44 【问题描述】:

现有脚本创建文本文件,每行包含一组 JSON 对象,例如,

["foo":1,"bar":2,"foo":3,"bar":4]
["foo":5,"bar":6,"foo":7,"bar":8,"foo":9,"bar":0]
…

我想在 Pig 中加载这些数据,分解数组并处理每个单独的对象。

我曾在 Twitter 的 Elephant Bird 中查看过使用 JsonLoader,但无济于事。它不会抱怨 JSON,但在运行以下命令时我得到“成功读取 0 条记录”:

register '/tmp/elephant-bird/core/target/elephant-bird-core-4.3-SNAPSHOT.jar';
register '/tmp/elephant-bird/hadoop-compat/target/elephant-bird-hadoop-compat-4.3-SNAPSHOT.jar';
register '/tmp/elephant-bird/pig/target/elephant-bird-pig-4.3-SNAPSHOT.jar';
register '/usr/local/lib/json-simple-1.1.1.jar';

a = load '/path/to/file.json' using com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad=true');
dump a;

我也尝试正常加载文件,将每一行视为包含单列字符数组,然后尝试将其解析为 JSON,但我找不到似乎可以解决问题的预先存在的 UDF .

有什么想法吗?

【问题讨论】:

我认为自定义 UDF 是这种情况下的最佳解决方案。不要害怕 UDF。如果你不使用它们,你就是在卖空自己。 Pig 并不打算解决低级别的问题,而这正是 UDF 的用途。 【参考方案1】:

就像 Donald 说的,你应该在这里使用 UDF。在Xplenty 中,我们编写了 JsonStringToBag 来补充 ElephantBird 的 JsonStringToMap。

【讨论】:

以上是关于如何在 Pig Latin 中每行加载一个带有 JSON 数组的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pig Latin 从 AWS S3 加载数据

PL/SQL 能否可靠地转换为 Pig Latin 或带有 Pig Latin 和 Hive 的 Oozie 管道

无法从 Pig Latin 的 Hadoop HDFS 加载文件

如何在 Pig Latin 中进行“总结”?

pig latin - 计数不同并分组

Store 命令中的 Pig Latin 参数