Как мне найти пересечение сумки и элемента без UDF в Pig? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть две переменные Pig: p , что составляет (id: int, companies: tuple(name:chararray)), и q , что составляет (id: int, company: chararray).

Теперь, после того как я присоединюсь к p и q по их идентификаторам, как отфильтровать те строки, где q::company отсутствует в p::companies?

PS Я прошел этот вопрос Проверить, присутствует ли элемент в сумке? но, похоже, это не совсем моя проблема.

Пример

образец p

1, (c1 c2 c3)

2, (c4 c5 c6)

3, (c2 c3 c5)

образец q

1, с3

2, с8

3, с5

ожидаемый выход после объединения

1, c3

3, c5

1 Ответ

0 голосов
/ 25 сентября 2018

Во-первых, вам нужно преобразовать p, чтобы каждая комбинация идентификатора и названия компании отображалась в отдельной строке.

p_flattened = FOREACH p GENERATE 
    id, 
    FLATTEN(TOKENIZE(companies.name, ' ')) AS company;
dump p_flattened;
(1,c1)
(1,c2)
(1,c3)
(2,c4)
(2,c5)
(2,c6)
(3,c2)
(3,c3)
(3,c5)

Затем присоединитесь к q, чтобы получить только идентификаторы и имена, которые встречаются в обоих отношениях, и выполните команду foreach, чтобы избавиться от дублирующих полей.

pq_joined = JOIN p_flattened BY (id, company), q BY (id, company);
final = FOREACH pq_joined GENERATE 
    q::id AS id, 
    q::company AS company;

dump final;
(1,c3)
(3,c5)
...