Pig:在没有模式

时间:2016-10-10 16:30:16

标签: sorting apache-pig

我有一个猪脚本,我在其中加载一些数据,通过函数流式传输以获得结果。结果是包含名为count的字段的json对象列表。现在我想根据count按降序对列表进行排序。

我在网上找到的所有文档都说我可以使用ORDER BY,但为此我需要知道别名的架构。现在,由于这是我在猪脚本中生成的别名,我不知道如何进行ORDER BY

所以我将它存储在临时文件中并使用模式再次加载并进行排序。但我认为这不是一个很好的做法。有人能告诉我如何在不使用临时文件的情况下做到这一点吗?

我的剧本现在是:

DEFINE create_list `create_list.py` SHIP ('$STREAM_FILE_PATH_SYNTAXNET/create_list.py');

input_data = LOAD '$DATA_INPUT';

result1 = STREAM input_data THROUGH create_list;
result2 = GROUP result1 BY 1;
result3 = FOREACH result2 GENERATE FLATTEN(result1);

STORE result3 INTO '/tmp/summarize';

a = LOAD '/tmp/summarize' USING JsonLoader('count:int,parent_pos:chararray,parent:chararray,child_dep:chararray,parent_dep:chararray,child:chararray,child_pos:chararray');
x = ORDER a BY count DESC;
STORE x INTO '$DATA_OUTPUT' USING JsonStorage();
fs -rm -r /tmp/summarize

正如我所说,我想将排序列表直接存储到$DATA_OUTPUT而不是使用临时文件。我该怎么做排序?

编辑:我尝试了x = ORDER result3 BY $0,但工作失败了。

1 个答案:

答案 0 :(得分:1)

从这个函数中订购关系

result1 = STREAM input_data THROUGH create_list;
result2 = ORDER result1 BY $0 DESC; -- Note:You might have to use (FLATTEN(result1)).$0 instead of $0 if the tuples/bag are nested.
STORE result2 INTO '$DATA_OUTPUT' USING JsonStorage();