在 Apache Pig 中计算不同的项目

Posted

技术标签:

【中文标题】在 Apache Pig 中计算不同的项目【英文标题】:Counting Distinct Items In Apache Pig 【发布时间】:2020-03-20 08:01:51 【问题描述】:

我有一个带有 Schema 的表用户表

|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|

问题...找出不同位置的每种产品的数量。

我写了一个猪脚本如下:-

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】:

在你的脚本中Result = FOREACH u2 GENERATE COUNT(u2.PRODUCT); 是错误的。 group by 操作后,数据结构发生变化。您可以通过describe u2 找到它。请尝试以下操作(我假设这些字段在 txt 文件中以逗号分隔):

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;

【讨论】:

以上是关于在 Apache Pig 中计算不同的项目的主要内容,如果未能解决你的问题,请参考以下文章

Apache PIG - 分组

Pig Hive Hbase 有何不同

如何使用 apache pig 将一个包转换为多个包?

如何计算 Apache Pig 中字符串的长度?

加入 Apache Pig

Apache Pig 学生成绩平均计算