Подсчет количества слов разной длины в данных, например, (8,1) (слов, длина) - PullRequest
0 голосов
/ 26 марта 2019

Функция должна выводить пару в формате и с примерами <”Length 8”, 1> или <”Length 7”, 1> или аналогичными, такими как <"8", 1>.

Чтобы получить длину строки «theWord» в Pig, вам нужно использовать функцию SIZE для каждого слова. Чтобы объединить размер слова со строкой «Длина», вам необходимо использовать функцию CONCAT для каждого размера. И, наконец, я знаю, что для того, чтобы преобразовать целое число в строку, чтобы объединить его с другой строкой, приведите его к (CHARARRAY). Например, я бы использовал "(CHARARRAY) SIZE (word)".

У меня написан код, но когда я пытаюсь сбросить данные, он не выполняет то, что я ожидаю. Я думаю, что мне может понадобиться сделать функцию подсчета, но я немного озадачен этим.

p1 = LOAD 'poems/input/Poem1.txt' USING TextLoader AS(line:Chararray);
p2 = LOAD 'poems/input/Poem2.txt' USING TextLoader AS(line:Chararray);
p3 = LOAD 'poems/input/Poem3.txt' USING TextLoader AS(line:Chararray);
p4 = LOAD 'poems/input/Poem4.txt' USING TextLoader AS(line:Chararray);
p5 = LOAD 'poems/input/Poem5.txt' USING TextLoader AS(line:Chararray);
p6 = LOAD 'poems/input/Poem6.txt' USING TextLoader AS(line:Chararray);
p = UNION p1, p2, p3, p4, p5, p6;
words = foreach p generate flatten(TOKENIZE(line , ' ,;:!?\t\n\r\f\\.\\-')) as word;
words_lower = foreach words generate LOWER(word) as word_lower;
words_unique = group words_lower by word_lower;
words_with_size = foreach words_unique generate SIZE(words_lower) as size, group;
words_with_size_concat = CONCAT words_with_count BY (CHARARRAY)size(words_lower) DESC, group;

1 Ответ

1 голос
/ 26 марта 2019

Я понял это! Код должен быть таким:

p1 = LOAD 'poems/input/Poem1.txt' USING TextLoader AS(line:Chararray);
p2 = LOAD 'poems/input/Poem2.txt' USING TextLoader AS(line:Chararray);
p3 = LOAD 'poems/input/Poem3.txt' USING TextLoader AS(line:Chararray);
p4 = LOAD 'poems/input/Poem4.txt' USING TextLoader AS(line:Chararray);
p5 = LOAD 'poems/input/Poem5.txt' USING TextLoader AS(line:Chararray);
p6 = LOAD 'poems/input/Poem6.txt' USING TextLoader AS(line:Chararray);
p = UNION p1, p2, p3, p4, p5, p6;
words = foreach p generate flatten(TOKENIZE(line , ' ,;:!?\t\n\r\f\\.\\-')) as word;
words_lower = foreach words generate LOWER(word) as word_lower;
words_length = foreach words generate CONCAT('Length ', (CHARARRAY)SIZE(word)) as word_length;
words_unique = group words_length by word_length 
words_with_count = foreach words_unique generate COUNT(words_length) as cnt, group;
words_with_count_sorted = ORDER words_with_count BY cnt DESC, group;
store words_with_count_sorted into 'poems/output/wordcount1';
...