Pig скрипт / команда для фильтрации файла по нескольким строкам - PullRequest
0 голосов
/ 24 марта 2012

Я пытаюсь написать программу на Java или скрипт Hadoop Pig, который будет принимать параметр, разделенный запятыми (например, abc, def, xyz), и фильтровать файл для записей, содержащих одну или несколько из этих строк.

Е.Г.

Входной файл:

1    abctree
2    pqrwewe
3    rtrxyz45
4    abcxyz
5    234rt23

Входной параметр: abc, def, xyz

Ожидаемый результат:

1    abctree
3    rtrxyz45
4    abcxyz

Я могу написать скрипт, который фильтрует файл по 1 строке, используя matches, но не знаю, как это сделать для нескольких строк. Нужно ли для этого писать UDF?

Я добавил тег Java к этому вопросу, потому что согласно моим первоначальным выводам мне придется написать UDF, который будет написан на Java. Поэтому, если кто-нибудь знает способ написать это на Java, пожалуйста, опубликуйте свои решения.

Ответы [ 2 ]

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

Я понял это:

B = filter A by (n matches '.*string1.*' or n matches '.*string2.*' or n matches '.*string3.*');

Это делает трюк.

Однако, по моему требованию, я буду принимать ввод через запятую из командной строки, например, string1, string2, string3. Поэтому следующая задача - каким-то образом отделить отдельные строки и использовать их в вышеприведенном выражении. Если кто-нибудь знает, как это сделать (особенно без UDF), пожалуйста, напишите.

0 голосов
/ 24 марта 2012

Я не знаю о Pig, но в Java вы могли бы использовать что-то вроде этого:

String[] words = input.split("[\\s,]+");

String line;
while((line = file.readLine()) != null){
    for(String word : words){
        if(line.contains(word)){
            System.out.print(line);
            break;
        }
    }
}

contains достаточно, чтобы найти слова. Вы можете создать регулярное выражение на основе строки input и сопоставить его с этим. Выражение будет выглядеть как foo|bar|baz, но вам нужно экранировать метасимволы, чтобы они были литеральными во время сопоставления, что можно сделать с помощью java.util.regex.Pattern.quote.

...