Как передавать файлы между компьютерами в Hadoop и искать строку с помощью Pig - PullRequest
0 голосов
/ 17 марта 2012

У меня есть 2 вопроса:

У меня большой архив записей, несколько миллионов.Мне нужно перенести этот файл с одного компьютера на компьютер кластера hadoop.Я думаю, что нет команды scp в hadoop (или есть?) Как передать файлы на машину hadoop?

Кроме того, как только файл находится в моем кластере hadoop, я хочу искать записи, которые содержатконкретная строка, скажем «XYZTechnologies».Как это сделать свинья?Некоторый пример кода был бы хорош, чтобы дать мне преимущество.

Это первый раз, когда я работаю над Hadoop / Pig.Прошу прощения, если это «слишком простой» вопрос.

РЕДАКТИРОВАТЬ 1

Я попробовал то, что предложил Jagaran, и получил следующую ошибку:

2012-03-18 04:12:55,655 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1000: Error during parsing. Encountered " "(" "( "" at line 3, column 26.
Was expecting:
    <QUOTEDSTRING> ...

Также обратите внимание, что я хочу найти строку в любом месте записи, поэтому я читаю разделенную табуляцией запись как один столбец:

A = load '/ user / abc/ part-00000 'с использованием PigStorage (' \ n ') AS (Y: chararray);

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

на ваш первый вопрос, я думаю, что Гай уже ответил на него. Что касается второго вопроса, похоже, что если вы просто хотите искать записи, которые содержат определенную строку, лучше использовать bash-скрипт, но если вы настаиваете на Pig, я предлагаю следующее:

A = load '/user/abc/' using PigStorage(',') AS (Y:chararray);
B = filter A by CONTAINS(A, 'XYZTechnologies');
store B into 'output' using PigStorage()

Имейте в виду, что разделитель по умолчанию PigStorage является вкладкой, поэтому поместите разделитель, который не отображается в вашем файле. тогда вы должны написать UDF, который возвращает логическое значение для CONTAINS, что-то вроде:

public class Contains extends EvalFunc<Boolean> {
@Override
public Boolean exec(Tuple input) throws IOException  
{
    return input.get(0).toString().contains(input.get(1).toString());
}
}

Я не проверял это, но это направление, которое я бы попробовал.

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

Для копирования в Hadoop.1. Вы можете установить Hadoop Client на другом компьютере, а затем выполнить hadoop dfs -copyFromLocal из командной строки. 2. Вы можете просто написать код Java, который будет использовать API-интерфейс FileSystem для копирования в hadoop.

Для Pig.Если вы знаете, что поле 2 может содержать XYZTechnologies

A = load '<input-hadoop-dir>' using PigStorage() as (X:chararray,Y:chararray);
-- There should not be "(" and ")" after 'matches'
B = Filter A by Y matches '.*XYZTechnologies.*';
STORE B into 'Hadoop=Path'  using PigStorage();
0 голосов
/ 18 сентября 2016

Привет, вы можете использовать функцию hadoop grep, чтобы найти конкретную строку в файле. например, мой файл содержит некоторые данные следующим образом

Привет, сам xyz. Мне нравится Hadoop. Hadoop это хорошо. я занимаюсь.

так что команда hadoop hadoop fs -text 'имя файла с путем' | grep 'строка для поиска'

Свинья раковина: - Загрузить данные файла в переменную pig

** data = LOAD 'file with path' с использованием PigStorage () as (text: chararray);

- найти нужный текст

txt = ФИЛЬТР данных по ($ 0 МАТЧЕЙ '. найденная строка. ');

- отобразить данные.

dump txt; --- или используйте Illustrate txt;

- сохранение его в другом файле STORE TXT в «путь» с помощью PigStorage ();

...