我有两个问题:
我有一大堆记录,几百万张。我需要将这个文件从一台机器传输到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';
对于你的第一个问题,我认为Guy已经回答了。至于第二个问题,如果你只想搜索包含特定字符串的记录,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默认的delimeter是tab,所以放一个不会出现在文件中的delimet。然后应该编写一个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());
}
}
我没有测试这个,但这是我会尝试的方向。
用于复制到Hadoop。1.您可以在另一台机器上安装Hadoop客户端,然后执行hadoop-dfs-copyFromLocal来自命令行2.您可以简单地编写一个java代码,使用FileSystem API将其复制到hadoop。
给猪。假设您知道字段2可能包含XYZ技术
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();
嗨,您可以使用hadoop grep函数来查找文件中的特定字符串。例如,我的文件包含一些数据,如下
你好xyz。我喜欢hadoop。hadoop很好。我在练习
因此hadoop命令是hadoop fs-text"要查找的带有路径的文件名"|grep"字符串"
清管器外壳:--将文件数据加载到清管器变量中
**data=LOAD"带路径的文件",使用PigStorage()作为(text:chararray);
--查找所需的文本
txt=过滤数据依据($0 MATCHES'.要查找的字符串。')
--显示数据。
转储txt----或使用Illustrated txt;
--将其存储在另一个文件中使用PigStorage()将txt存储到"路径"中;