Как я могу написать подзапрос на Pig Latin? - PullRequest
1 голос
/ 25 октября 2011

У меня есть два файла данных:

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 )

Как мне написать скрипт Свиньи?

Я пытался:

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 одной строкой, Я пишу пользовательский ComparisonFunc, в этой функции, разбить строку на начало и конец и проверить, находится ли col1 в этом диапазоне?

НО КАК? это мой второй день на PIG ......

Ответы [ 2 ]

1 голос
/ 26 марта 2012

это еще одно возможное решение:

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;
0 голосов
/ 27 октября 2011

Одним очень наивным способом было бы раздуть данные из range.txt.

range = LOAD 'range.txt' AS (min:long, max:long, name:chararray);<br> m = FOREACH range GENERATE FLATTEN(udf(min, max, name));<br> data = LOAD 'data.txt' AS NUMBER:long;<br> output = JOIN m BY $0, data by NUMBER;<br> dump output;

Выходной ключ, пары значений, начинающиеся с min до max, с ключом в качестве числа и значения'название'.Таким образом, 1 10 a будет 1 a, 2 a, 3 a и т. Д. Убедитесь, что udf возвращает пакет данных, так что сглаживание даст вам одну запись на строку.

Не суперэффективно, но это может быть началомточка.

...