#apache-pig
#apache-pig
Вопрос:
У меня есть два файла данных:
range.txt
Min Max Name
1 10 a
11 20 b
21 30 c
31 100 d
101 200 e
и data.txt
1
3
40
150
Результат, который я хочу, это:
1 a ( because 1 <= 1 <= 10 )
3 a ( because 1 <= 3 <= 10 )
40 d ( because 31 <= 40 <= 100 )
150 e ( because 101 <= 150 <= 200 )
Как мне написать сценарий Pig?
Я пытался:
MyREPO = LOAD '/repos/range.txt' USING PigStorage(',') AS (start:long,end:long,location:chararray);
MyDATA = LOAD '/repos/data.txt' AS (col1:long);
B = FOREACH MyDATA {
C = FILTER MyREPO BY ( MyDATA.col1 >= start AND MyDATA.col1 <= end );
GENERATE MyDATA.col1,C.location;
}
STORE C into '/result/' USING PigStorage();
приведенный выше скрипт не компилируется с помощью pig.
но это показывает, что я хочу сделать.
Спасибо.
может быть, этот путь проходит?
сделайте начало и конец в range.txt объединенная строка, сделайте col1 в data.txt для одной строки я пишу пользовательскую функцию сравнения, в этой функции разделяю строку на начало и конец и проверяю, находится ли col1 в этом диапазоне?
НО КАК? это мой второй день на PIG……
Комментарии:
1. введите range.txt является [началом, концом] и ключом в data.txt является col1, отношения между двумя ключами не являются соединением равенства; но один ключ находится в диапазоне другого, я не знаю, как их соединить.
Ответ №1:
это еще одно возможное решение:
myRepo = LOAD 'range.txt' USING PigStorage(',') AS (start:long,end:long,location:chararray);
myData = LOAD 'data.txt' AS (col1:long);
myRepoData = cross myRepo, myData;
myRepoData2 = filter myRepoData by col1 >= start and col1 <= end;
myRepoData3 = foreach myRepoData2 generate col1, location;
dump myRepoData3;
Ответ №2:
Одним из очень наивных способов было бы раздуть данные из range.txt .
range = LOAD 'range.txt' AS (min:long, max:long, name:chararray);
m = FOREACH range GENERATE FLATTEN(udf(min, max, name));
data = LOAD 'data.txt' AS NUMBER:long;
output = JOIN m BY $0, data by NUMBER;
dump output;
Выводите пары ключ, значение, начиная с минимального до максимального, с ключом, поскольку число и значение — ‘name’. Итак, 1 10 a будет 1 a, 2 a, 3 a и т. Д. Убедитесь, что udf возвращает пакет данных, чтобы flatten давал вам по одной записи на строку.
Не очень эффективно, но это может быть отправной точкой.