4

我正在尝试使用主要是 TSV(制表符分隔值)的架构加载文件,但其中一个字段是 JSON 值。似乎猪拉丁语具有用于制表符(或其他)分隔值的 TextLoader 和用于 JSON 的 JsonLoader ...

特别是,每一行数据看起来像:

date\tevent_name\tevent_details\n

其中 event_details 是 JSON 格式的字符串。其他的只是 char 数组。

加载此数据的最简单方法是什么?

注意:我使用的是 Pig 版本 0.11.1。

4

2 回答 2

10

(经过大量研究,这是答案:)

从http://mvnrepository.com/下载注册命令所需的必要库。

猪脚本如下:

register 'libs/elephant-bird-core-4.1.jar';
register 'libs/elephant-bird-pig-4.1.jar';
register 'libs/guava-14.0.1.jar';
register 'libs/json-simple-1.1.1.jar';
register 'libs/piggybank.jar';

define decode_json com.twitter.elephantbird.pig.piggybank.JsonStringToMap();

e1 = load '$filename' using PigStorage() as (
    date: chararray,
    event_name: chararray,
    event_details_str: chararray,
);

-- Remove the header row:
e2 = filter e1 by not date matches '.*DATE';

-- Convert the event_details from a JSON string to a map:
events = foreach e2 generate *, decode_json(event_details_str) as event_details;
于 2013-08-16T19:04:23.370 回答
3

mbells 回答工作正常,我一直在努力解决的一件事是如何检索地图值。下面是从事件映射中检索 key1、key2 的示例。

fields = FOREACH events GENERATE events#'key1', events#'key2';
于 2014-05-21T14:30:37.593 回答