Свинья: ОШИБКА 1045: Невозможно вывести функцию сопоставления для COUNT, так как несколько или ни один из них не подходит. Пожалуйста, используйте явное приведение - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь посчитать твиты на пользователя через Pig.Но я, кажется, столкнулся с проблемой.Я и одноклассник впервые используем Apache Pig (на самом деле Hadoop и все различные компоненты в целом).Мы пытаемся рассказать о Twitter, который предоставил нам некоторый код.Но когда мы пытаемся выполнить COUNT, он выдает нам следующую ошибку:

ERROR 1045: Не удалось вывести функцию сопоставления для COUNT, так как несколько или ни один из них не подходит.Пожалуйста, используйте явное приведение.

Мы пытались провести какое-то исследование в Интернете, но найти решение просто сложно.Мы попытались запустить его с «Pig -x local», но также и через HDFS.

Мы пытаемся выполнить COGROUP для двух таблиц, а затем COUNT для подсчета количества твитов на пользователя.

Для получения дополнительной информации: мы запускаем это на AWS от Amazon.Я не знаю, может ли это быть полезным.

Ссылка на учебник, на всякий случай: https://www.edureka.co/blog/pig-tutorial/ Ссылка на вставку из DUMP COGROUP между двумя таблицами: 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 Ответ

0 голосов
/ 04 апреля 2019

Есть три проблемы с кодом, которым вы поделились выше.

  1. Вы используете имя count для одного из ваших отношений, которое может привести к двусмысленности относительно того, имеете ли вы в виду псевдоним count или функцию count.Я бы рекомендовал использовать другое имя, например twitter_count.
  2. Имена отношений чувствительны к регистру, поэтому, если вы определите отношение с именем 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;
...