Подсчет различных предметов в Apache Свинья - PullRequest
0 голосов
/ 20 марта 2020

У меня есть таблица пользовательских таблиц со схемой

|Column 1 | USER ID |int|

|Column 2 |EMAIL|chararray|

|Column 3 |LANGUAGE |chararray|

|Column 4 |LOCATION |chararray|

и транзакционная таблица со схемой

|Column 1 | ID |int|

|Column 2 |PRODUCT|int|

|Column 3 |USER ID |int|

|Column 4 |PURCHASE AMOUNT |double|

|Coulmn 5 |DESCRIPTION |chararray|

Ques ... Узнайте количество каждого продукта в разных местах.

Я написал сценарий Pig следующим образом: -

user = LOAD '/tmp/users.txt' USING PigStorage ('    ')
AS (USER_ID:int, EMAIL:chararray, LANGUAGE:chararray, LOCATION:chararray);

transaction = LOAD '/tmp/transaction.txt' USING PigStorage ('   ')
AS (ID:int, PRODUCT:int,USER_ID:int, PURCHASE_AMOUNT:double,DESCRIPTION:chararray);

u1 = JOIN user by USER_ID, transaction by USER_ID;

u2 = GROUP u1 by LOCATION;

Result = FOREACH u2 GENERATE COUNT(u2.PRODUCT);

DUMP Result;

Ошибка --- ОШИБКА org. apache .pig.tools.grunt.Grunt - ОШИБКА 1200: Ошибка сценария Pig для анализа: неверная скалярная проекция: u2

Вот что я получаю.

1 Ответ

1 голос
/ 20 марта 2020

В вашем скрипте Result = FOREACH u2 GENERATE COUNT(u2.PRODUCT); неверно. После группировки по операции структура данных изменяется. Вы можете найти это с помощью describe u2. Пожалуйста, попробуйте следующее (я предполагаю, что поля в текстовом файле разделены запятыми):

user = LOAD 'user.txt' USING PigStorage (',') AS (USER_ID:int, EMAIL:chararray, LANGUAGE:chararray, LOCATION:chararray);

transaction = LOAD 'transaction.txt' USING PigStorage (',') AS (ID:int, PRODUCT:int,USER_ID:int, PURCHASE_AMOUNT:double,DESCRIPTION:chararray);

u1 = JOIN user by USER_ID, transaction by USER_ID;

u2 = GROUP u1 by (LOCATION,PRODUCT);

Result = FOREACH u2 GENERATE FLATTEN(group) as (LOCATION,PRODUCT), COUNT($1);

DUMP Result;
...