如何在Hadoop中的机器之间传输文件并使用Pig搜索字符串

时间:2012-03-16 22:36:42

标签: hadoop mapreduce apache-pig hdfs

我有两个问题:

我有一个很大的记录文件,几百万个。我需要将此文件从一台机器传输到hadoop集群机器。我猜hadoop中没有scp命令(或者在那里?)如何将文件传输到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 =使用PigStorage('\ n')AS(Y:chararray)加载'/ user / abc / part-00000';

3 个答案:

答案 0 :(得分:2)

对于你的第一个问题,我认为盖伊已经回答了这个问题。 至于第二个问题,看起来如果你只想搜索包含特定字符串的记录,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 :(得分:1)

复制到Hadoop。 1.您可以在其他计算机上安装Hadoop Client然后执行     来自命令行的hadoop dfs -copyFromLocal 你可以简单地编写一个使用FileSystem API复制到hadoop的java代码。

对于猪。 假设您知道字段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();

答案 2 :(得分:0)

您好,您可以使用hadoop grep函数查找文件中的特定字符串。 例如,我的文件包含一些数据如下

你好我自己xyz。我喜欢hadoop。 hadoop很好。 我在练习。

所以hadoop命令是 带有路径'|的 hadoop fs -text'文件名grep'字符串可以找到'

猪壳: - 将文件数据载入猪变量

** data = LOAD'文件,路径'使用PigStorage()为(text:chararray);

- 找到所需的文字

txt = FILTER数据($ 0 MATCHES'。字符串可以找到。');

- 显示数据。

dump txt; ---或使用Illustrate txt;

- 将其存储在另一个文件中 使用PigStorage();

将txt存储到“path”中