Pig:错误 1045:无法将 COUNT 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表

Posted

技术标签:

【中文标题】Pig:错误 1045:无法将 COUNT 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表【英文标题】:Pig: ERROR 1045: Could not infer the matching function for COUNT as multiple or none of them fit. Please use an explicit cast 【发布时间】:2019-04-03 19:46:25 【问题描述】:

我正在尝试通过 Pig 计算每个用户的推文。但我似乎遇到了一个问题。我和一个同学第一次使用 Apache Pig(实际上是 Hadoop 和所有不同的组件作为一个整体)。我们正在尝试关注一个关于 Twitter 的小案例,它为我们提供了一些代码。但是当我们尝试执行 COUNT 时,它会给我们以下错误:

错误 1045:无法将 COUNT 的匹配函数推断为多个匹配或都不匹配。请使用显式转换。

我们尝试在互联网上进行一些研究,但很难找到解决方案。我们尝试使用“Pig -x local”运行它,也可以通过 HDFS 运行它。

我们正在尝试做的是在两个表上执行 COGROUP,然后是 COUNT 来计算每个用户的推文数量。

更多信息:我们正在亚马逊的 AWS 上运行它。我不知道这是否会有所帮助。

教程链接,以防万一:https://www.edureka.co/blog/pig-tutorial/ 链接到两个表之间的 COGROUP 的 DUMP 的 pastebin:https://pastebin.com/DAFhAJV4

这是我们目前的代码:

UserData = LOAD 'hdfs://ourip/data/userv5.csv' using PigStorage(',') AS (Id:int,UserName:chararray);
TweetData = LOAD 'hdfs://ourip/data/tweetsv5.csv' using PigStorage(',') AS (UserId:int,Text:chararray);

groupby_user2 = COGROUP TweetData by 'UserId', UserData by 'Id';

count = FOREACH groupby_user2 GENERATE COUNT(Id);
dump COUNT;

【问题讨论】:

【参考方案1】:

您在上面共享的代码存在三个问题。

    您将名称count 用于您的关系之一,这可能会导致您的意思是别名count 还是函数count 的歧义。我建议使用不同的名称,例如 twitter_count。 关系名称区分大小写,因此如果您定义一个名为twitter_count 的关系,然后尝试dump TWITTER_COUNT,您将收到错误消息。

我认为您在问题中引用的错误是上述 1 和 2 的某种组合。

    即使你解决了我提到的问题,当你做COUNT(Id)时你仍然会看到一个错误:

    Invalid field projection. Projected field [Id] does not exist in schema:
    group:chararray,TweetData:bag:tuple(UserID:chararray),UserData:bag:tuple(Id:chararray)
    

    这是因为 Id 嵌套在 UserData 包中,因此您需要指定 COUNT(UserData.Id)。但这就是你要计算的意思吗?这将为您提供每个组的用户数(可能为 1)。我认为您的意思是计算推文的数量,例如:

    twitter_count = FOREACH groupby_user2 GENERATE COUNT(TweetData);
    dump twitter_count;
    

【讨论】:

以上是关于Pig:错误 1045:无法将 COUNT 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表的主要内容,如果未能解决你的问题,请参考以下文章

使用 pig 生成最大数量

在 Pig 中对元组中的所有字段应用 TRIM()

猪拉丁语:错误 org.apache.pig.tools.grunt.Grunt - 错误 1045

无法将 org.apache.pig.builtin.SUM 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表

我可以在 Pig 中保留不匹配的项目吗?

无法在 Pig 中使用 max 和 sum 函数